jetty入门教程

小TOT 创建于 2017-02-07

JETTY介绍

Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。

如何选择tomcat和jetty,请参阅择jetty,tomcat

如何启动

官网下载jetty压缩包,笔者是下载的jetty最新版本:9.3.8。解压。运行java -jar start.jar即可启动容器。访问http://localhost:8080即可看到jetty的提示页面,如果webapp下面没有部署任何应用,将看到一个jetty默认的404页面。

如何查看启动的模块和配置?

cd $JETTY_HOME/demo-base/ java -jar $JETTY_HOME/start.jar --list-modules ... java -jar %JETTY_HOME/start.jar --list-config

自定义启动参数

通过以上 list-config命令可以查看,运行jetty时使用的配置,以及要加载的配置文件。就像下面这样:

Java Environment:
-----------------
 java.home = /usr/java/jdk1.8.0_77/jre
 java.vm.vendor = Oracle Corporation
 java.vm.version = 25.77-b03
 java.vm.name = Java HotSpot(TM) 64-Bit Server VM
 java.vm.info = mixed mode
 java.runtime.name = Java(TM) SE Runtime Environment
 java.runtime.version = 1.8.0_77-b03
 java.io.tmpdir = /tmp
 user.dir = /opt/jetty-9.3.8
 user.language = en
 user.country = US

Jetty Environment:
-----------------
 jetty.version = 9.3.8.v20160314
 jetty.tag.version = master
 jetty.home = /opt/jetty-9.3.8
 jetty.base = /opt/jetty-9.3.8

Config Search Order:
--------------------
 <command-line>
 ${jetty.base} -> /opt/jetty-9.3.8
 ${jetty.home} -> /opt/jetty-9.3.8


JVM Arguments:
--------------
 (no jvm args specified)

System Properties:
------------------
 (no system properties specified)

Properties:
-----------
 java.version = 1.8.0_77
 java.version.major = 1
 java.version.minor = 8
 java.version.revision = 0
 java.version.update = 77

Jetty Server Classpath:
-----------------------
Version Information on 34 entries in the classpath.
Note: order presented here is how they would appear on the classpath.
      changes to the --module=name command line options will be reflected here.
 0:    3.10.2.v20150120-1634 | ${jetty.base}/lib/apache-jsp/org.eclipse.jdt.core.compiler.ecj-4.4.2.jar
 1:          9.3.8.v20160314 | ${jetty.base}/lib/apache-jsp/org.eclipse.jetty.apache-jsp-9.3.8.v20160314.jar
 2:                   8.0.23 | ${jetty.base}/lib/apache-jsp/org.mortbay.jasper.apache-el-8.0.27.jar
 3:                      2.3 | ${jetty.base}/lib/apache-jsp/org.mortbay.jasper.apache-jsp-8.0.27.jar
 4:                    1.2.5 | ${jetty.base}/lib/apache-jstl/org.apache.taglibs.taglibs-standard-impl-1.2.5.jar
 5:                    1.2.5 | ${jetty.base}/lib/apache-jstl/org.apache.taglibs.taglibs-standard-spec-1.2.5.jar
 6:                    (dir) | ${jetty.base}/resources
 7:                    3.1.0 | ${jetty.base}/lib/servlet-api-3.1.jar
 8:                 3.1.0.M0 | ${jetty.base}/lib/jetty-schemas-3.1.jar
 9:          9.3.8.v20160314 | ${jetty.base}/lib/jetty-http-9.3.8.v20160314.jar
10:          9.3.8.v20160314 | ${jetty.base}/lib/jetty-server-9.3.8.v20160314.jar
11:          9.3.8.v20160314 | ${jetty.base}/lib/jetty-xml-9.3.8.v20160314.jar
12:          9.3.8.v20160314 | ${jetty.base}/lib/jetty-util-9.3.8.v20160314.jar
13:          9.3.8.v20160314 | ${jetty.base}/lib/jetty-io-9.3.8.v20160314.jar
14:          9.3.8.v20160314 | ${jetty.base}/lib/jetty-jndi-9.3.8.v20160314.jar
15:      1.4.1.v201005082020 | ${jetty.base}/lib/jndi/javax.mail.glassfish-1.4.1.v201005082020.jar
16:                      1.2 | ${jetty.base}/lib/jndi/javax.transaction-api-1.2.jar
17:          9.3.8.v20160314 | ${jetty.base}/lib/jetty-security-9.3.8.v20160314.jar
18:          9.3.8.v20160314 | ${jetty.base}/lib/jetty-servlet-9.3.8.v20160314.jar
19:          9.3.8.v20160314 | ${jetty.base}/lib/jetty-webapp-9.3.8.v20160314.jar
20:          9.3.8.v20160314 | ${jetty.base}/lib/jetty-deploy-9.3.8.v20160314.jar
21:          9.3.8.v20160314 | ${jetty.base}/lib/jetty-plus-9.3.8.v20160314.jar
22:          9.3.8.v20160314 | ${jetty.base}/lib/jetty-annotations-9.3.8.v20160314.jar
23:                    5.0.1 | ${jetty.base}/lib/annotations/asm-5.0.1.jar
24:                    5.0.1 | ${jetty.base}/lib/annotations/asm-commons-5.0.1.jar
25:                      1.2 | ${jetty.base}/lib/annotations/javax.annotation-api-1.2.jar
26:                      1.0 | ${jetty.base}/lib/websocket/javax.websocket-api-1.0.jar
27:          9.3.8.v20160314 | ${jetty.base}/lib/websocket/javax-websocket-client-impl-9.3.8.v20160314.jar
28:          9.3.8.v20160314 | ${jetty.base}/lib/websocket/javax-websocket-server-impl-9.3.8.v20160314.jar
29:          9.3.8.v20160314 | ${jetty.base}/lib/websocket/websocket-api-9.3.8.v20160314.jar
30:          9.3.8.v20160314 | ${jetty.base}/lib/websocket/websocket-client-9.3.8.v20160314.jar
31:          9.3.8.v20160314 | ${jetty.base}/lib/websocket/websocket-common-9.3.8.v20160314.jar
32:          9.3.8.v20160314 | ${jetty.base}/lib/websocket/websocket-server-9.3.8.v20160314.jar
33:          9.3.8.v20160314 | ${jetty.base}/lib/websocket/websocket-servlet-9.3.8.v20160314.jar

Jetty Active XMLs:
------------------
 ${jetty.base}/etc/home-base-warning.xml
 ${jetty.base}/etc/jetty.xml
 ${jetty.base}/etc/jetty-http.xml
 ${jetty.base}/etc/jetty-deploy.xml
 ${jetty.base}/etc/jetty-plus.xml
 ${jetty.base}/etc/jetty-annotations.xml

jetty的所有的启动配置在上面都可以找到,打开jettybase/etc目录下的jetty.xml文件。可以看到下面配置片段:

  <Call name="addConnector">
    <Arg>
      <New id="httpConnector" class="org.eclipse.jetty.server.ServerConnector">
        <Arg name="server"><Ref refid="Server" /></Arg>
        <Arg name="acceptors" type="int"><Property name="jetty.http.acceptors" deprecated="http.acceptors" default="-1"/></Arg>
        <Arg name="selectors" type="int"><Property name="jetty.http.selectors" deprecated="http.selectors" default="-1"/></Arg>
        <Arg name="factories">
          <Array type="org.eclipse.jetty.server.ConnectionFactory">
            <Item>
              <New class="org.eclipse.jetty.server.HttpConnectionFactory">
                <Arg name="config"><Ref refid="httpConfig" /></Arg>
                <Arg name="compliance"><Call class="org.eclipse.jetty.http.HttpCompliance" name="valueOf"><Arg><Property name="jetty.http.compliance" default="RFC7230"/></Arg></Call></Arg>
              </New>
            </Item>
          </Array>
        </Arg>
        <Set name="host"><Property name="jetty.http.host" deprecated="jetty.host" /></Set>
        <Set name="port"><Property name="jetty.http.port" deprecated="jetty.port" default="8080" /></Set>
        <Set name="idleTimeout"><Property name="jetty.http.idleTimeout" deprecated="http.timeout" default="30000"/></Set>
        <Set name="soLingerTime"><Property name="jetty.http.soLingerTime" deprecated="http.soLingerTime" default="-1"/></Set>
        <Set name="acceptorPriorityDelta"><Property name="jetty.http.acceptorPriorityDelta" deprecated="http.acceptorPriorityDelta" default="0"/></Set>
        <Set name="acceptQueueSize"><Property name="jetty.http.acceptQueueSize" deprecated="http.acceptQueueSize" default="0"/></Set>
      </New>
    </Arg>
  </Call>

注意到一下两行配置。

 <Set name="host"><Property name="jetty.http.host" deprecated="jetty.host" /></Set>
            <Set name="port"><Property name="jetty.http.port" deprecated="jetty.port" default="8080" /></Set>

这应该是我们熟悉的配置,使用过tomcat的朋友一眼就能看出以上两个配置的意义。jetty.http.host配置了主机名。jetty.http.port配置了服务的端口号。默认为8080.注意到以一个property标签。name为jetty.http.port。这里实际上是我们本节讲的重点,启动参数。细心的朋友一定会注意到在jetty的根目录下有一个start.ini文件,里面配置了jetty.http.port这个变量。从文件的名字来看,这应该是一个启动jetty的一个配置文件。启动jetty添加参数变量一共两种方式,

  • 一种是直接在命令上加,比如使用这样的命令java -jar $JETTY_HOME/start.jar jetty.http.port=8444。即可自定义jetty.http.port=8090。
  • 第二种就是将参数配置在start.ini中。直接运行java -jar $JETTY_HOME/start.jar

如何自定义jettyBase和jettyhome环境参数呢?

默认情况下,在没有指定以上参数时,jetty会默认start.jar所在的目录为jettybase,和jettyhome目录。 可以在运行命令时添加java参数来设置。 比如像下面的命令:

 /usr/bin/java -Djetty.logging.dir=/opt/jetty-9.3.8/logs -Djetty.home=/opt/jetty-9.3.8 -Djetty.base=/opt/jetty-9.3.8 -Djava.io.tmpdir=/tmp -jar /opt/jetty-9.3.8/start.jar

在java命令后,在start.jar前使用-D为java运行环境参数。

如何优雅的启动jetty

读者看到这里,一定会觉得这些配置都好繁琐。一个个参数需要手动的添加到命令上来。确实好麻烦,我们又不是程序,不能自动的填写相关的命令参数,每次运行时都要手动的敲一遍。有没有好的方法省去繁琐的命令参数呢。答案是自己编写启动脚本!那我们需要自己手动编写脚本?答案是随你,反正jetty官方已经帮助我们编写好了,用不用看我们自己。 jetty目录下有一个bin目录,里面有一个jetty.sh的脚本文件。该脚本文件就是官方为我们提供的启动脚本。不妨使用一下命令试试 ./jetty.sh start 神奇的事情出现了!!我们的jetty居然启动起来了!这是怎么回事呢?jetty启动时都配置了哪些参数?我们需要这个jetty.sh到底做了些什么。 使用./jetty.sh status查看脚本运行时的参数情况。

总结

  1. jetty由java编写,其核心执行文件为start.jar。
  2. etc下面的配置文件,start.ini。-Djettybase 这些参数全都是配置。
  3. 使用java -jar启动也好,还是./jetty.sh启动也好。其核心还是还是使用了java -jar。只是程序的运行形势不一样罢了。前者操作繁琐,但是参数比较明了,一看便知启动用到的参数。后者操作简单,将配置放在配置文件中,可定制性强