本文主要介绍如何以域模式为 CDE.IO 应用部署 Jetty 服务器。截止到本文编写时,Jetty 的最新版本为 9.3.6.v20151106,以下所有内容均是基于此版本描述的。
从官方网站下载 Jetty 压缩包,并解压到某个本地目录,下文将此解压目录以 $JETTY_HOME
代替。
创建一个区别于 $JETTY_HOME
的其他目录,作为应用程序的根目录(下文以 $JETTY_BASE
代替此目录)。在这个目录下创建如下一些文件夹 etc
, lib/btm
, resources
, start.d
, webapps
。
将应用程序部署包放置到 $JETTY_BASE/webapps
目录下,为了配合 Jetty 的使用,需要删除如下一些文件:
- WEB-INF/lib/slf4j-api-1.7.12.jar
- WEB-INF/lib/logback-core-1.1.3.jar
- WEB-INF/lib/logback-classic-1.1.3.jar
如果不存在,则忽略。
在 $JETTY_HOME/modules
目录下,创建 logging.mod 文件(备份原有文件),内容如下:
#
# Jetty Module for SLF4J and Logback
#
[name]
logging
[depend]
resources
[lib]
lib/logging/*.jar
[files]
logs/
http://central.maven.org/maven2/org/slf4j/slf4j-api/1.7.12/slf4j-api-1.7.12.jar|lib/logging/slf4j-api-1.7.12.jar
http://central.maven.org/maven2/ch/qos/logback/logback-core/1.1.3/logback-core-1.1.3.jar|lib/logging/logback-core-1.1.3.jar
http://central.maven.org/maven2/ch/qos/logback/logback-classic/1.1.3/logback-classic-1.1.3.jar|lib/logging/logback-classic-1.1.3.jar
https://raw.githubusercontent.com/jetty-project/logging-modules/master/logback/jetty-logging.properties|resources/jetty-logging.properties
将应用程序部署包中的 WEB-INF/classes/logback.xml
文件复制到 $JETTY_BASE/resources/
目录下。
在 $JETTY_BASE/lib/btm
目录添加如下一些 jar 包(这些 jar 包都可以在编译过 cdeio-runtime 项目以后在本地的 Maven 库中找到):
- btm-2.1.4.jar
- btm-jetty9-lifecycle-2.1.4.jar
- connector-api-1.5.jar
- jta-1.1.jar
- mysql-connector-java-5.1.34.jar
如果需要连接 Oracle 数据库,还要添加 ojdbc6-11.2.0.4.jar 文件。
在 $JETTY_HOME/modules
目录下,创建 btm.mod 文件,内容如下:
#
# Jetty Module for Bitronix Transaction Manager
#
[name]
btm
[xml]
etc/btm.xml
[depend]
resources
[lib]
lib/btm/*.jar
在 $JETTY_BASE/etc
目录下,创建 btm.xml 文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure id="Server" class="org.eclipse.jetty.server.Server">
<Call name="getConfiguration" class="bitronix.tm.TransactionManagerServices">
<Set name="serverId">jetty-btm-node0</Set>
<Set name="logPart1Filename"><SystemProperty name="jetty.home" default="." />/work/btm1.tlog</Set>
<Set name="logPart2Filename"><SystemProperty name="jetty.home" default="." />/work/btm2.tlog</Set>
</Call>
<Call name="addManaged">
<Arg>
<New class="bitronix.tm.integration.jetty9.BTMLifeCycle"/>
</Arg>
</Call>
</Configure>
如果需要调整 BTM 的一些参数,可以在 $JETTY_BASE/resources
目录下创建 bitronix-default-config.properties
文件,并根据 BTM 的官方文档对参数进行配置与调整。
当配置文件中需要出现明文密码的时候(例如数据库连接信息),可以使用如下方法对密码进行混淆或加密:
java -cp $JETTY_HOME/lib/jetty-util-9.3.6.v20151106.jar org.eclipse.jetty.util.security.Password <User> <Password>
注:jetty-util-9.3.6.v20151106.jar 文件名中的版本号会随着使用 Jetty 版本的不同而相应变化。
- User 参数表示用户名
- Password 参数表示该用户名的密码
例如,要对 MySQL 数据库的密码为 asecretpassword 的用户 cdeio 加密的话,就使用如下命令:
java -cp $JETTY_HOME/lib/jetty-util-9.3.6.v20151106.jar org.eclipse.jetty.util.security.Password cdeio asecretpassword
产生结果如下:
2015-07-09 14:31:19.403:INFO::main: Logging initialized @175ms
asecretpassword
OBF:1s3g1yf41v1x1w8b1yf21vu91v9u1xfj1v8s1vv11yf41w9f1v2h1yf21s3m
MD5:fbb760b7dbf82666856500d4fd4a02c9
CRYPT:cdF3GWe/OBlQ2
因为数据库密码需要在程序运行的时候以原始形式与服务器进行校验,因此这里我们只能选择混淆以后的密码结果(OBF:1s3g1yf41v1x1w8b1yf21vu91v9u1xfj1v8s1vv11yf41w9f1v2h1yf21s3m
),该混淆后的密码对普通用户而言是不易读的,但是并不具有真正意义上的安全性,因为在程序运行期间会被转换为原始密码。
在配置文件中要使用混淆后的密码要如下配置:
<New id="DSTest" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg></Arg>
<Arg>jdbc/DSTest</Arg>
<Arg>
<New class="com.jolbox.bonecp.BoneCPDataSource">
<Set name="driverClass">com.mysql.jdbc.Driver</Set>
<Set name="jdbcUrl">jdbc:mysql://localhost:3306/foo</Set>
<Set name="username">dbuser</Set>
<Set name="password">
<Call class="org.eclipse.jetty.util.security.Password" name="deobfuscate">
<Arg>OBF:1s3g1yf41v1x1w8b1yf21vu91v9u1xfj1v8s1vv11yf41w9f1v2h1yf21s3m</Arg>
</Call>
</Set>
<Set name="minConnectionsPerPartition">5</Set>
<Set name="maxConnectionsPerPartition">50</Set>
<Set name="acquireIncrement">5</Set>
<Set name="idleConnectionTestPeriod">30</Set>
</New>
</Arg>
</New>
在 $JETTY_BASE
目录下运行命令:
java -jar $JETTY_HOME/start.jar --add-to-startd=http,https,deploy,plus,logging,jsp,btm,ext,gzip,requestlog
如果是 Windows 用户,还需要在 $JETTY_BASE
目录下创建 start.ini
文件,并添加如下内容:
--Dfile.encoding=UTF-8
在 $JETTY_BASE
目录下运行 java -jar $JETTY_HOME/start.jar
即可启动系统。如果是 Windows 系统需要使用 java -jar $JETTY_HOME/start.jar --exec
来运行,因为在 start.ini
文件中添加了启动参数。