5.3.1. 快速部署

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

快速部署是指在 Studio 中运行/调试应用程序或者点击主菜单的 CUBA > Build Tasks > Deploy。其实底层机制是 Studio 执行 deploy Gradle 任务,该任务在 build.gradle 文件中,分别为 coreweb 模块做了任务声明。在第一次执行 deploy 前,它还会运行 setupTomcat 任务安装和初始化本地的 Tomcat 服务。也可以不使用 Studio 手动运行这些任务。

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

快速部署会在 deploy 目录创建如下目录结构(只列出重要的文件和目录):

  1. deploy/
  2. app_home/
  3. app/
  4. conf/
  5. temp/
  6. work/
  7. app-core/
  8. conf/
  9. temp/
  10. work/
  11. logs/
  12. app.log
  13. local.app.properties
  14. logback.xml
  15. tomcat/
  16. bin/
  17. setenv.bat, setenv.sh
  18. startup.bat, startup.sh
  19. debug.bat, debug.sh
  20. shutdown.bat, shutdown.sh
  21. conf/
  22. catalina.properties
  23. server.xml
  24. logging.properties
  25. Catalina/
  26. localhost/
  27. lib/
  28. hsqldb-2.4.1.jar
  29. logs/
  30. shared/
  31. lib/
  32. webapps/
  33. app/
  34. app-core/
  • deploy/app_home - 应用程序主目录

    • app/conf, app-core/conf - web 客户端和中间件应用程序的配置目录

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

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

    • logs - 日志目录。应用程序的默认主日志文件为 app.log

    • local.app.properties - 为此次部署设置特殊的应用程序属性的文件。

    • logback.xml - 日志配置。

  • deploy/tomcat - 本地 Tomcat 目录。

    • bin – 包含配置、启动和停止 Tomcat 服务的脚本:

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

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

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

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

        > catalina.bat run

        $ ./catalina.sh run

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

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

  1. - `conf` 包含 Tomcat 的配置文件。
  2. - `catalina.properties` Tomcat 属性文件。如果需要从 `shared/lib` 目录加载共享库(参阅下文),这个文件需要配置下面这行:
  3. ```
  4. shared.loader=${catalina.home}/shared/lib/*.jar
  5. ```
  6. - `server.xml` Tomcat 配置文件。
  7. - `logging.properties` Tomcat 服务日志配置文件。
  8. - `Catalina/localhost` 这个目录下可以放置 [context.xml]($393ae0a3b5a72923.md) 应用程序部署描述文件。这个目录下放置的描述文件会比 `META-INF` 目录下的描述文件优先级高。这种机制可以用在生产环境。比如,通过这种机制可以配置跟应用程序本身不同的数据库连接参数,从而达到生产环境连接不同数据库的要求。
  9. 针对不同服务的描述文件需要有不同服务的应用程序名称和 `.xml` 扩展名。所以,如果是为 `app-core` 创建部署描述文件,需要拷贝 `webapps/app-core/META-INF/context.xml` 文件成 `conf/Catalina/localhost/app-core.xml` 文件,然后通过修改 `conf/Catalina/localhost/app-core.xml` 内容覆盖设置。
  10. - `lib` 服务的 *通用类加载器(common classloader)* 加载类库的目录。这些类库可以被这个 Tomcat 服务和所有部署在其中的 web 应用程序加载。还有,这个目录应该有数据库的 JDBC 驱动(`hsqldb-XYZ.jar`, `postgresql-XYZ.jar` 等)。
  11. - `logs` Tomcat 日志目录。
  12. - `shared/lib` 所有部署的应用可访问的类库目录。服务的 *共享类加载器(shared classloader)* 会加载这些类库。使用这个目录的方法在上面 `conf/catalina.properties` 文件中提到过。
  13. 构建脚本的 [deploy]($df5d779bf22a7c01.md) 任务会拷贝所有不在 `jarNames` 参数列举的类库到这个目录。
  14. - `webapps` web 应用程序目录。每个应用程序在它自己的子目录里,子目录按照 *展开成文件夹的 WARexploded WAR)* 形式命名。
  15. 构建脚本的 [deploy]($df5d779bf22a7c01.md) 任务会按照 `appName` 参数来创建应用程序子目录,除了其它的文件之外,还会拷贝列在 `jarNames` 参数的类库到每个应用程序的 `WEB-INF/lib` 目录。

可以在 build.gradle 里指定 Tomcat 的路径和应用程序主目录的路径,分别使用 cuba.tomcat.dircuba.appHome 属性,示例:

  1. cuba {
  2. // ...
  3. tomcat {
  4. dir = "$project.rootDir/some_path/tomcat"
  5. }
  6. appHome = "$project.rootDir/some_path/app_home"
  7. }