5.3.3. 部署 WAR 到 WildFly

CUBA 应用程序的 WAR 包可以部署在 WildFly 应用服务中。下面这个示例是部署使用 PostgreSQL 9.6 的 CUBA 应用程序到 Windows 的 WildFly 14.0.0。

  1. 编辑 build.gradle 并在 global 模块的 dependencies 部分添加依赖:

    1. runtime 'org.reactivestreams:reactive-streams:1.0.1'
  2. 组装并且部署项目到默认的 Tomcat 服务,以便加载项目所有的依赖到本地。

  3. 为程序配置应用程序主目录

    • 创建一个 WildFly 服务能完全控制的目录,比如 C:\Users\UserName\app_home

    • tomcat/conf 拷贝 logback.xml 文件到这个目录,并修改 logDir 属性:

  1. ```
  2. <property name="logDir" value="${app.home}/logs"/>
  3. ```
  1. 配置 WildFly 服务

    • 在本地目录安装 WildFly,比如 C:\wildfly

    • 编辑 C:\wildfly\bin\standalone.conf.bat 文件,并将下面这行添加到文件末尾:

  1. ```
  2. set "JAVA_OPTS=%JAVA_OPTS% -Dapp.home=%USERPROFILE%/app_home -Dlogback.configurationFile=%USERPROFILE%/app_home/logback.xml"
  3. ```
  4. 这行里将 `app.home` 系统属性指向之前创建的应用程序主目录,并且设置日志的配置文件指向先前创建的 `logback.xml` 文件。也可以使用绝对路径替换 `%USERPROFILE%` 变量。
  5. - 对比一下 WildFly Hibernate Validator 版本跟 CUBA 的有没有不同,如果 CUBA 使用的是比较新的版本,那么用 `tomcat\shared\lib` 下面的版本(比如 `hibernate-validator-5.4.2.Final.jar`)替换掉 `C:\wildfly\modules\system\layers\base\org\hibernate\validator\main\hibernate-validator-x.y.z-sometext.jar`
  6. - `\wildfly\modules\system\layers\base\org\hibernate\validator\main\module.xml` 文件中更新一下替换的 JAR 包的版本。
  7. - WildFly 中注册 PostgreSQL 驱动,从 `tomcat\lib` 目录拷贝 `postgresql-9.4.1212.jar` `C:\wildfly\standalone\deployments` 目录。
  8. - 配置 WildFly logger:打开 `\wildfly\standalone\configuration\standalone.xml` 文件,在 `<subsystem xmlns="urn:jboss:domain:logging:{version}"` 区域添加下面两行:
  9. ```
  10. <subsystem xmlns="urn:jboss:domain:logging:6.0">
  11. <add-logging-api-dependencies value="false"/>
  12. <use-deployment-logging-config value="false"/>
  13. . . .
  14. </subsystem>
  15. ```
  1. 创建 JDBC 数据源

    • 执行 standalone.bat 启动 WildFly。

    • 浏览器打开管理员窗口 http://localhost:9990。第一次登录的时候,需要创建用户名和密码。

    • 打开 Configuration - Subsystems - Datasources and Drivers - Datasources 标签页,为应用程序创建新数据源:

  1. ```
  2. Name: Cuba
  3. JNDI Name: java:/jdbc/CubaDS
  4. JDBC Driver: postgresql-9.4.1212.jar
  5. Driver Module Name: org.postgresql
  6. Driver Class Name: org.postgresql.Driver
  7. Connection URL: your database URL
  8. Username: your database username
  9. Password: your database password
  10. ```
  11. 如果按照之前的步骤拷贝了 `postgresql-x.y.z.jar`,那么 JDBC 驱动会在自动检测到的驱动列表里显示。
  12. 点击 **Test connection** 按钮测试数据库连接。
  13. - 启用这个数据源。
  1. 构建应用程序

    • 在 Studio 打开 Deployment > *WAR settings

    • 勾选 Build WAR 复选框。

    • Application home directory 字段设置 ${app.home}

    • 保存设置。

    • 在 IDE 中打开 build.gradle 并且在 buildWar 任务中添加 doAfter 属性。这个属性会控制拷贝 WildFly 部署描述文件:

      1. task buildWar(type: CubaWarBuilding) {
      2. appProperties = ['cuba.automaticDatabaseUpdate' : true]
      3. singleWar = false
      4. appHome = '${app.home}'
      5. doAfter = {
      6. copy {
      7. from 'jboss-deployment-structure.xml'
      8. into "${project.buildDir}/buildWar/core/war/META-INF/"
      9. }
      10. copy {
      11. from 'jboss-deployment-structure.xml'
      12. into "${project.buildDir}/buildWar/web/war/META-INF/"
      13. }
      14. }
      15. }

      对于单一 WAR(singleWAR)配置,这个任务稍有不同:

      1. task buildWar(type: CubaWarBuilding) {
      2. webXmlPath = modules/web/web/WEB-INF/single-war-web.xml
      3. appProperties = [‘cuba.automaticDatabaseUpdate : true]
      4. appHome = ${app.home}’
      5. doAfter = {
      6. copy {
      7. from jboss-deployment-structure.xml
      8. into ${project.buildDir}/buildWar/war/META-INF/“
      9. }
      10. }
      11. }

      如果项目还包含了 Polymer 模块,在 single-war-web.xml 文件中添加下面这些配置:

      1. <servlet>
      2. <servlet-name>default</servlet-name>
      3. <init-param>
      4. <param-name>resolve-against-context-root</param-name>
      5. <param-value>true</param-value>
      6. </init-param>
      7. </servlet>
    • 在项目根目录,创建 jboss-deployment-structure.xml 文件,在里面添加 WildFly 部署描述文件:

  1. ```
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
  4. <deployment>
  5. <exclusions>
  6. <module name="org.apache.commons.logging" />
  7. <module name="org.apache.log4j" />
  8. <module name="org.jboss.logging" />
  9. <module name="org.jboss.logging.jul-to-slf4j-stub" />
  10. <module name="org.jboss.logmanager" />
  11. <module name="org.jboss.logmanager.log4j" />
  12. <module name="org.slf4j" />
  13. <module name="org.slf4j.impl" />
  14. <module name="org.slf4j.jcl-over-slf4j" />
  15. </exclusions>
  16. </deployment>
  17. </jboss-deployment-structure>
  18. ```
  19. - 执行 `buildWar` 任务创建 WAR 包。
  1. build\distributions\war 目录拷贝 app-core.warapp.war 到 WildFly 目录 \wildfly\standalone\deployments

  2. 重启 WildFly 服务。

  3. 可以通过 http://localhost:8080/app 访问应用,日志文件会保存在应用程序主目录的 C:\Users\UserName\app_home\logs 目录下。