5.3.6. UberJAR 部署

这是在生产环境运行 CUBA 应用程序最简单的方法。可以通过 buildUberJar Gradle 任务来构建一个包含所有依赖的 JAR 文件(可以参考 Studio 的 *Deployment > UberJAR setting 界面),然后可以在命令行使用 java 来运行应用程序:

java -jar app.jar

所以应用程序的参数都是在构建时候定义的,但是可以在运行时覆盖这些参数(参阅以下)。web 应用程序默认的端口是 8080,地址是 http://host:8080/app。如果项目中有 Polymer UI,默认的 Polymer 客户端地址是 http://host:8080/app-front

如果为 Middleware 和 Web 客户款各自构建了单独的 JAR 包,可以用相同的方式运行:

java -jar app-core.jar

java -jar app.jar

web 客户端的默认端口是 8080,它会尝试连接中间件的默认地址 localhost:8079。所以如果在两个单独的窗口中运行了上面的两行命令,可以通过 http://localhost:8080/app 地址访问 web 客户端。

可以通过 Java 系统参数的方式提供应用程序属性来更改构建时候设置的应用程序默认参数。而且,端口号、上下文名称和 Jetty 配置文件的路径都可以通过命令行参数修改。

命令行参数
  • port - 定义嵌入的 HTTP 服务的端口,示例:

    java -jar app.jar -port 9090

    需要注意的是,如果客户端和 core 模块分别构建了单独的 JAR 包,且为 core 模块指定了端口,那么要为客户端模块提供带有相应 block 地址的 cuba.connectionUrlList 应用程序属性,示例:

    java -jar app-core.jar -port 7070
    
    java -Dcuba.connectionUrlList=http://localhost:7070/app-core -jar app.jar
  • contextName - 应用程序 block 的 web 上下文名称。比如,如果需要在 http://localhost:8080/sales 地址访问 web 客户端,运行如下命令:

    java -jar app.jar -contextName sales
  • frontContextName - Polymer UI web 上下文名称(对单一 JAR,web JAR 或者 portal JAR 都有效)。

  • portalContextName - 单一 JAR 里面配置 portal 上下文名称。

  • jettyEnvPath - Jetty 环境配置文件的路径。用来重写构建时候指定的 coreJettyEnvPath 参数的值。这个新值可以设定为绝对路径或者工作目录的相对路径。

  • jettyConfPath - Jetty 服务配置文件的路径。用来重写构建时候指定的 webJettyConfPath/coreJettyConfPath/portalJettyConfPath 参数的值。这个新值可以设定为绝对路径或者工作目录的相对路径。

应用程序主目录

默认情况下,应用程序主目录就是程序工作的目录。也就是说应用程序子目录会在运行应用程序的目录里面创建。主目录可以通过 Java 系统参数 app.home 来重新指定。比如,如果想设置应用程序主目录为 /opt/app_home,可以在命令行添加如下参数:

java -Dapp.home=/opt/app_home -jar app.jar
日志

如果需要更改内嵌的日志设置,可以通过 Java 系统参数 logback.configurationFile 来提供一个指向新配置文件的 URL,示例:

java -Dlogback.configurationFile=file:./logback.xml -jar app.jar

这里假设 logback.xml 文件是在启动服务的目录下。

如果需要正确的设定日志输出目录,需要确保 logback.xml 文件里的 logDir 属性指定了应用程序主目录的 logs 子目录。

<configuration debug="false">
    <property name="logDir" value="${app.home}/logs"/>
    <!-- ... -->
设置部署时应用程序属性

可以在部署环境设置应用程序属性,设置一些在应用程序构建时无法提供的属性设置(比如处于安全考虑)。下面的例子使用命名为 "sample" 模块前缀为 "app" 的项目进行展示。

1) 修改所有项目中 web 应用程序的 web.xml 文件。修改 appPropertiesConfig servlet 上下文参数值的第三行。用下面的格式配置 local.app.properties 的路径,使用应用程序主目录的相对目录:

"file:${app.home}/web-application-name/conf/local.app.properties"

比如,对于 app-core 模块,需要修改 modules/core/web/WEB-INF/web.xml 文件,并将 appPropertiesConfig 设置为以下内容:

<!-- Application properties config files -->
<context-param>
    <param-name>appPropertiesConfig</param-name>
    <param-value>
        classpath:com/company/sample/app.properties
        /WEB-INF/local.app.properties
        "file:${app.home}/app-core/conf/local.app.properties"
    </param-value>
</context-param>

2) 在应用程序主目录创建 local.app.properties 文件,并设置必要的值:

admin@server:/opt/app_home$ cat app/conf/local.app.properties
cuba.web.loginDialogDefaultUser=<disabled>
cuba.web.loginDialogDefaultPassword=<disabled>

admin@server:/opt/app_home$ cat app-core/conf/local.app.properties
cuba.userSessionExpirationTimeoutSec = 7200

3) 保证在启动应用程序时设置了正确的主目录:

java -Dapp.home=/opt/app_home -jar app.jar

4) 检查启动日志。应该能看到下面这几行,每个 web 应用程序一行:

14:49:44.875 INFO  c.h.c.c.s.AbstractWebAppContextLoader   - Loading
app properties from file:/opt/app_home/app-core/conf/local.app.properties
...
14:49:49.339 INFO  c.h.c.c.s.AbstractWebAppContextLoader   - Loading
app properties from file:/opt/app_home/app/conf/local.app.properties
...
停止应用程序

可以通过下面几种方式平和的停掉应用程序服务:

  • 在应用程序运行的终端窗口按下 Ctrl+C

  • 在类 Unix 系统执行 kill <PID>

  • 发送停止键值(比如,特定字符序列)到应用程序的特定端口,这个端口是在启动应用程序的时候通过命令行指定的。有以下命令行参数:

    • stopPort - 监听停止键值或者发送停止键值的端口。

    • stopKey - 停止键值。默认值 SHUTDOWN

    • stop - 通过发送停止键值停掉其它进程。

示例:

# 启动应用 1 并且在 9090 监听 SHUTDOWN
java -jar app.jar -stopPort 9090

# 启动应用 2 并且在 9090 监听 MYKEY
java -jar app.jar -stopPort 9090 -stopKey MYKEY

# 关停应用 1
java -jar app.jar -stop -stopPort 9090

# 关停应用 2
java -jar app.jar -stop -stopPort 9090 -stopKey MYKEY