5.3.2. 部署 WAR 至 Jetty

以下是一个部署 WAR 包到 Jetty web 服务器的示例。

我们将使用下面的文件目录结构:

  • C:\work\jetty-home\ - Jetty 安装目录

  • C:\work\jetty-base\ - Jetty 配置目录,用来保存 Jetty 的配置文件,额外的库以及 web 应用程序。

  • C:\work\app_home\ - CUBA 应用程序主目录

    1. 使用 Studio 中的 CUBA project tree > Project > Deployment > WAR Settings 对话框或者手动在build.gradle 末尾添加 buildWar 任务:

      task buildWar(type: CubaWarBuilding) {
          appProperties = ['cuba.automaticDatabaseUpdate': 'true']
          singleWar = false
      }

      需要注意的是,这里给 Middleware 和 web 客户端构建了单独的两个 WAR 文件。

    2. 从命令行启动 buildWar 任务(假设已经预先创建了 Gradle wrapper):

      gradlew buildWar

      如果成功的话,会在项目的 build\distributions\war 目录创建 app-core.warapp.war

    3. 创建一个应用程序主目录目录,比如,c:\work\app_home

    4. 从开发环境的 Tomcat(deploy/tomcat/conf 项目子目录)复制 logback.xml 到应用程序主目录,并编辑文件中的 logDir 属性:

      <property name="logDir" value="${app.home}/logs"/>
    5. 下载并安装 Jetty 到本地目录,比如 c:\work\jetty-home。本示例使用 jetty-distribution-9.4.22.v20191022.zip 测试通过。

    6. 创建 c:\work\jetty-base 目录,并且在这个目录打开命令行窗口执行以下命令:

      java -jar c:\work\jetty-home\start.jar --add-to-start=http,jndi,deploy,plus,ext,resources
    7. 创建 c:\work\jetty-base\app-jetty.xml 文件,定义数据库连接池。对于 PostgreSQL 数据库的该文件内容应当基于以下模板:

      <?xml version="1.0"?>
      <!DOCTYPE Configure PUBLIC "-" "http://www.eclipse.org/jetty/configure_9_0.dtd">
      <Configure id="wac" class="org.eclipse.jetty.webapp.WebAppContext">
          <New id="CubaDS" class="org.eclipse.jetty.plus.jndi.Resource">
              <Arg/>
              <Arg>jdbc/CubaDS</Arg>
              <Arg>
                  <New class="org.apache.commons.dbcp2.BasicDataSource">
                      <Set name="driverClassName">org.postgresql.Driver</Set>
                      <Set name="url">jdbc:postgresql://localhost/db_name</Set>
                      <Set name="username">username</Set>
                      <Set name="password">password</Set>
                      <Set name="maxIdle">2</Set>
                      <Set name="maxTotal">20</Set>
                      <Set name="maxWaitMillis">5000</Set>
                  </New>
              </Arg>
          </New>
      </Configure>

      MS SQL 数据库的 app-jetty.xml 文件需要使用下面这个模板:

      <?xml version="1.0"?>
      <!DOCTYPE Configure PUBLIC "-" "http://www.eclipse.org/jetty/configure_9_0.dtd">
      <Configure id="wac" class="org.eclipse.jetty.webapp.WebAppContext">
          <New id="CubaDS" class="org.eclipse.jetty.plus.jndi.Resource">
              <Arg/>
              <Arg>jdbc/CubaDS</Arg>
              <Arg>
                  <New class="org.apache.commons.dbcp2.BasicDataSource">
                      <Set name="driverClassName">com.microsoft.sqlserver.jdbc.SQLServerDriver</Set>
                      <Set name="url">jdbc:sqlserver://server_name;databaseName=db_name</Set>
                      <Set name="username">username</Set>
                      <Set name="password">password</Set>
                      <Set name="maxIdle">2</Set>
                      <Set name="maxTotal">20</Set>
                      <Set name="maxWaitMillis">5000</Set>
                  </New>
              </Arg>
          </New>
      </Configure>
    8. 数据库连接池需要下载以下这些 JAR 并且添加到 c:\work\jetty-base\lib\ext 目录。其中有两个文件可以在 deploy\tomcat\shared\lib 项目子目录中找到:

      commons-pool2-2.6.2.jar
      commons-dbcp2-2.7.0.jar
      commons-logging-1.2.jar
    9. 从 Jetty 安装目录复制 start.ini 文件至 c:\work\jetty-base 目录。在 c:\work\jetty-base\start.ini 文件开始处添加下列内容:

      --exec
      -Xdebug
      -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n
      -Dapp.home=c:\work\app_home
      -Dlogback.configurationFile=c:\work\app_home\logback.xml
      app-jetty.xml
    10. 复制数据库的 JDBC 驱动到 c:\work\jetty-base\lib\ext 目录。可以从项目的 deploy\tomcat\lib 目录复制驱动。比如对于 PostgreSQL,驱动文件是 postgresql-42.2.5.jar

    11. 复制 WAR 文件到 c:\work\jetty-base\webapps 目录。

    12. c:\work\jetty-base 目录打开命令行窗口并且执行:

      java -jar c:\work\jetty-home\start.jar
    13. 在浏览器打开 http://localhost:8080/app