http://www.littlefisher.site/2018/06/27/Jetty9%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E/

公司所使用的Jetty版本还是Jetty7,最近一方面是有想法把公司的Jetty版本升级为最新,另外也让自己熟悉一下Jetty的使用与配置,也算是对自己的一个提升吧。公司内对技术的看重程度较低,只能通过公司内点点滴滴的技术问题修复,来间接提升自己的能力。这边博文就是为了说明一下Jetty9如何做到所有的配置都集于一个文件,避免每次部署新的Jetty都要在各个文件中来来回回的修改文件。

基础命令

Jetty的根目录下执行以下命令

1
java -jar start.jar --add-to-start=console-capture

 

上面命令中的console-capture为功能,Jetty默认仅开启一部分功能,其他所需的功能,通过以上命令,可以自己来添加。添加成功后,会在start.ini中新增该功能的配置项。
如果需要一次新增多个功能,执行下面命令

1
java -jar start.jar --add-to-start=console-capture,jvm

 

这个命令新增了console-capturejvm2个功能。具体功能是干嘛用的,后面做描述。

1
java -jar start.jar --list-config

以上命令用于展示出当前Jetty已启动的功能及已配置的参数

当前公司所需Jetty功能

console-capture

该功能用于开启Jetty的日志打印功能
执行下面命令开启该功能

1
java -jar start.jar --add-to-start=console-capture

 

该功能在start.ini中所对应的配置参数如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# --------------------------------------- 
# Module: console-capture
# Redirects JVMs console stderr and stdout to a log file,
# including output from Jetty's default StdErrLog logging.
# --------------------------------------- 
--module=console-capture

## Logging directory (relative to $jetty.base)
# jetty.console-capture.dir=logs

## Whether to append to existing file
# jetty.console-capture.append=true

## How many days to retain old log files
# jetty.console-capture.retainDays=90

## Timezone of the log timestamps
# jetty.console-capture.timezone=GMT

 

以上内容为执行了命令后自动在start.ini中生成的文件,下面附上一份说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# --------------------------------------- 
# Module: console-capture
# Redirects JVMs console stderr and stdout to a log file,
# including output from Jetty's default StdErrLog logging.
# --------------------------------------- 
--module=console-capture

## 日志存放位置,默认是当前Jetty的跟目录下的logs目录,该配置一般需要修改为多个jetty统一的日志存放位置,例如/data/logs/jettyDEMO
# jetty.console-capture.dir=logs

## 重启服务后,是否接着之前的日志文件继续打印,默认是false
# jetty.console-capture.append=true

## 老的日志文件存放多久,默认是90天
# jetty.console-capture.retainDays=90

## 日志文件的时区配置,默认是GMT,针对于咱们国家而言,由于是东八区,所以配置为Asia/Shanghai
# jetty.console-capture.timezone=GMT

 

jvm

该模块用于配置Jetty启动时的jvm参数
执行下面命令开启该功能

1
java -jar start.jar --add-to-start=jvm

 

该功能在start.ini中所对应的配置参数如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# --------------------------------------- 
# Module: jvm
# A noop module that creates an ini template useful for
# setting JVM arguments (eg -Xmx )
# --------------------------------------- 
--module=jvm

## JVM Configuration
## If JVM args are include in an ini file then --exec is needed
## to start a new JVM from start.jar with the extra args.
##
## If you wish to avoid an extra JVM running, place JVM args
## on the normal command line and do not use --exec
# --exec
# -Xmx2000m
# -Xmn512m
# -XX:+UseConcMarkSweepGC
# -XX:ParallelCMSThreads=2
# -XX:+CMSClassUnloadingEnabled
# -XX:+UseCMSCompactAtFullCollection
# -XX:CMSInitiatingOccupancyFraction=80
# -internal:gc
# -XX:+PrintGCDateStamps
# -XX:+PrintGCTimeStamps
# -XX:+PrintGCDetails
# -XX:+PrintTenuringDistribution
# -XX:+PrintCommandLineFlags
# -XX:+DisableExplicitGC

 

以上内容为执行了命令后自动在start.ini中生成的文件,下面附上一份说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# --------------------------------------- 
# Module: jvm
# A noop module that creates an ini template useful for
# setting JVM arguments (eg -Xmx )
# --------------------------------------- 
--module=jvm

## JVM Configuration
## 由于Jetty启动之后才能读取这个配置文件,所以说其实并没有加载这里的JVM参数。而使用--exec的话,会额外启动一个进行用于加载这里的JVM配置参数。除非说JVM的配置参数是写死在bin/jetty.sh里,否则--exec是必须要带的。
--exec
-Xms512m
-Xmx768m
# -Xmx2000m
# -Xmn512m
# -XX:+UseConcMarkSweepGC
# -XX:ParallelCMSThreads=2
# -XX:+CMSClassUnloadingEnabled
# -XX:+UseCMSCompactAtFullCollection
# -XX:CMSInitiatingOccupancyFraction=80
# -internal:gc
# -XX:+PrintGCDateStamps
# -XX:+PrintGCTimeStamps
# -XX:+PrintGCDetails
# -XX:+PrintTenuringDistribution
# -XX:+PrintCommandLineFlags
# -XX:+DisableExplicitGC

 

Jetty启动

进入Jetty根目录下的bin目录,执行如下命令

1
2
3
sh jetty.sh start # 启动Jetty
sh jetty.sh restart # 重启Jetty
sh jetty.sh stop # 停止Jetty

 

命令就是这么简单

设置contextPath

Jetty根目录的webapps下,新增跟war包同名的xml文件,例如有一个war包叫做hsjry-credit-deploy.war,则新增一个hsjry-credit-deploy.xml文件,文件中是以下内容

1
2
3
4
5
6
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextPath">/blog-web</Set>
  <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/hsjry-credit-deploy.war</Set>
</Configure>

 

通过这种方式设置contextPath

代码中Jetty版本升级

由于部署所有的Jetty版本都已经升级,未避免开发人员自测时和部署时由于环境不同导致的bug,所以建议代码中也把Jetty版本进行升级。另外maven中针对于JettygroupId都已经进行了变更,原本的版本都已经不做维护了。

以下内容是credit模块deploy工程的pom.xml里,关于Jetty容器原来的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<build>
  <finalName>hsjry-credit-deploy</finalName>
  <plugins>
    <plugin>
      <groupId>org.mortbay.jetty</groupId>
      <artifactId>maven-jetty-plugin</artifactId>
      <version>6.1.26</version>
      <configuration>
        <connectors>
          <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
            <port>8086</port>
            <port>8097</port>
            <maxIdleTime>30000</maxIdleTime>
          </connector>
        </connectors>
        <!-- 自动发现改变是时间,进行热部署,默认是0,不热部署 <scanIntervalSeconds>1</scanIntervalSeconds> -->
        <webAppSourceDirectory>src/main/webapp</webAppSourceDirectory>
        <webAppConfig>
          <contextPath>/hsjry-credit-deploy</contextPath>
        </webAppConfig>
        <reload>automatic</reload>
        <systemProperties>
          <systemProperty>
            <name>org.mortbay.util.URI.charset</name>
            <value>UTF-8</value>
          </systemProperty>
        </systemProperties>
      </configuration>
    </plugin>

  </plugins>
</build>

 

以下内容是新版本Jetty进行配置的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<build>
  <plugins>
    <plugin>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-maven-plugin</artifactId>
      <version>9.4.9.v20180320</version>
      <configuration>
        <!--自动发现改变是时间,进行热部署,默认是0,不热部署-->
        <scanIntervalSeconds>10</scanIntervalSeconds>
        <!--手动重加载 可选值 :[automatic|manual]-->
        <reload>automatic</reload>
        <httpConnector>
          <port>8097</port>
          <idleTimeout>30000</idleTimeout>
        </httpConnector>
        <webApp>
          <contextPath>/hsjry-credit-deploy</contextPath>
        </webApp>
        <webAppSourceDirectory>src/main/webapp</webAppSourceDirectory>
        <!--
        jetty9.3+版本的默认字符集已使用UTF-8,无需再进行配置
        https://github.com/eclipse/jetty.project/issues/804
        -->
      </configuration>
    </plugin>

  </plugins>
</build>