5.3.1. Tomcat 快速部署

快速部署在开发程序的时候是默认的部署方式,因为快速部署的构建用时最少,能自动安装并且启动应用服务。生产环境也可以用这种方式部署。

快速部署是使用 build.gradle 文件中的 coreweb 模块的 deploy 任务。在第一次执行 deploy 之前,应当先执行 setupTomcat 任务来安装并且初始化本地 Tomcat 服务。

需要确保系统环境没有 CATALINA_HOMECATALINA_BASECLASSPATH 这三个环境变量。这些环境变量可能会导致启动 Tomcat 出问题并且在日志里没有任何提示。移除这些环境变量后需要重启机器。

快速部署之后,会在 Tomcat 目录下创建以下目录结构(只列出重要的目录和文件),Tomcat 目录是由 build.gradle 脚本的 cuba.tomcat.dir 参数指定:

bin/
    setenv.bat, setenv.sh
    startup.bat, startup.sh
    debug.bat, debug.sh
    shutdown.bat, shutdown.sh

conf/
    catalina.properties
    server.xml
    logback.xml
    logging.properties
    Catalina/
        localhost/
    app/
    app-core/

lib/
    hsqldb-2.2.9.jar

logs/
    app.log

shared/
    lib/

temp/
    app/
    app-core/

webapps/
    app/
    app-core/

work/
    app/
    app-core/
  • bin – 包含配置、启动和停止 Tomcat 服务的工具:

    • setenv.bat, setenv.sh – 这两个脚本用来设置环境变量。这些脚本可以用来设置 JVM 内存参数、logging 日志的配置文件、配置访问 JMX,以及连接调试器的参数。

      如果在 Linux 虚拟机(VPS)中,Tomcat 启动的很慢,可以尝试在 setenv.sh 里给 JVM 配置非阻塞熵源(non-blocking entropy source):

      CATALINA_OPTS="$CATALINA_OPTS -Djava.security.egd=file:/dev/./urandom"
    • startup.bat, startup.sh – 启动 Tomcat 服务的脚本。在 Windows 环境,Tomcat 会在一个单独的终端窗口启动,但是在 *nix 系统服务会在后台启动。

      需要在当前终端窗口启动服务,使用以下命令代替 startup.*

      > catalina.bat run

      $ ./catalina.sh run

    • debug.bat, debug.sh – 跟 startup.* 类似,但是会启动能连接调试器的 Tomcat 服务。这些脚本会在执行构建脚本中的 start 任务的时候使用。

    • shutdown.bat, shutdown.sh – 停止 Tomcat 服务。

  • conf – 包含 Tomcat 的配置文件和部署的应用程序。

    • catalina.properties – Tomcat 属性文件。如果需要从 shared/lib 目录加载共享库(参阅后面),这个文件需要配置下面这行:

      shared.loader=${catalina.home}/shared/lib/*.jar
    • server.xml – Tomcat 配置描述文件。

    • logback.xml – 应用程序日志配置描述文件。

    • logging.properties – Tomcat 服务日志配置描述文件。

    • Catalina/localhost – 这个目录下可以放置 context.xml 应用程序部署描述文件。这个目录下放置的描述文件会比 META-INF 目录下的描述文件优先级高。这种机制可以用在生产环境。比如,通过这种机制可以配置跟应用程序本身不同的数据库连接参数,从而达到生产环境连接不同数据库的要求。

      针对不同服务的描述文件需要有不同服务的应用程序名称和 .xml 扩展名。所以,如果是为 app-core 创建部署描述文件,需要拷贝 webapps/app-core/META-INF/context.xml 文件成 conf/Catalina/localhost/app-core.xml 文件,然后通过修改 conf/Catalina/localhost/app-core.xml 内容覆盖设置。

    • app – web 客户端应用程序配置目录

    • app-core – 中间件应用程序配置目录

  • lib – 服务的 通用类加载器(common classloader) 加载类库的目录。这些类库可以被这个 Tomcat 服务和所有部署在其中的 web 应用程序加载。还有,这个目录应该有数据库的 JDBC 驱动(hsqldb-XYZ.jar, postgresql-XYZ.jar 等)。

  • logs – 应用程序和 Tomcat 服务的日志目录。应用程序的主要日志文件是 app.log(参考为 Tomcat 设置日志)。

  • shared/lib – 所有部署的应用可访问的类库目录。服务的 共享类加载器(shared classloader) 会加载这些类库。使用这个目录的方法在上面 conf/catalina.properties 文件中提到过。

    构建脚本的 deploy 任务会拷贝所有不在 jarNames 参数列举的类库到这个目录。

  • temp/app, temp/app-core – web 客户端和中间件应用程序的临时目录

  • webapps – web 应用程序目录。每个应用程序在它自己的子目录里,子目录按照 展开成文件夹的 WAR(exploded WAR) 形式命名。

    构建脚本的 deploy 任务会按照 appName 参数来创建应用程序子目录,除了其它的文件之外,还会拷贝列在 jarNames 参数的类库到每个应用程序的 WEB-INF/lib 目录。

  • work/app, work/app-core – web 客户端和中间件应用的工作目录