[深入浅出Jetty 04]Jetty的启动方式

Jetty提供了众多的参数和配置来保证满足不同场景下的启动方式。

除了极大方便嵌入式启动之外,从程序外部也非常好容易启动jetty。

[原文:http://www.blogjava.net/xylz/archive/2012/03/28/372923.html]

运行方式

运行方法1

首先我们以一个标准的jar程序启动来看待这个问题. 
[adyliu @adyliu-pc jetty8] $  cat run.sh 
#!/bin/bash


JETTY_CLASSPATH= " ./start.jar "
for f in `find ./lib -name  " *.jar "`
do
    JETTY_CLASSPATH= $JETTY_CLASSPATH: $f
done

# echo $JETTY_CLASSPATH
java -cp  $JETTY_CLASSPATH $*

然后运行查看下
[adyliu @adyliu-pc jetty8] $  sh run.sh org.eclipse.jetty.start.Main
2012- 03- 28  16: 00: 57.532:INFO:oejs.Server:jetty- 8.1. 2.v20120308
2012- 03- 28  16: 00: 57.578:INFO:oejs.AbstractConnector:Started SelectChannelConnector@ 0.0. 0.0: 8080

由于没有任何web环境,因此此时访问任何地址应该都是404。测试一下:
[adyliu @adyliu-pc jetty8] $  curl -v http://127.0.0.1:8080
* About to  connect() to  127.0. 0.1 port  8080
*   Trying  127.0. 0.1  connected
* Connected to  127.0. 0.1 ( 127.0. 0.1) port  8080
> GET / HTTP/ 1.1
> User-Agent: curl/ 7.15. 5 (x86_64-redhat-linux-gnu) libcurl/ 7.15. 5 OpenSSL/ 0.9.8b zlib/ 1.2. 3 libidn/ 0.6. 5
> Host:  127.0. 0.1: 8080
Accept: */*

< HTTP/ 1.1  404 Not Found
< Date: Wed,  28 Mar  2012  08: 15: 27 GMT
< Content-Type: text/html
< Content- Length618
< Server: Jetty( 8.1. 2.v20120308)
<HTML>
<HEAD>
<TITLE>Error  404 - Not Found</TITLE>
<BODY>
<H2>Error  404 - Not Found.</H2>

运行方法2

另外上述运行等价于:
[adyliu @adyliu-pc jetty8] $  sh run.sh org.eclipse.jetty.xml.XmlConfiguration etc/jetty.xml
2012- 03- 28  16: 31: 16.481:INFO:oejs.Server:jetty- 8.1. 2.v20120308
2012- 03- 28  16: 31: 16.518:INFO:oejs.AbstractConnector:Started SelectChannelConnector@ 0.0. 0.0: 8080

运行方法3

第三种方法就是使用封装好的start.jar,这个jar包封装了一些常规的配置。

在开始之前,我们先重命名下默认的start.ini,因为默认的配置文件会启动一个test.war环境。
mv start.ini start.ini.default
[adyliu @adyliu-pc jetty8] $  java -jar start.jar
2012- 03- 28  16: 35: 21.941:INFO:oejs.Server:jetty- 8.1. 2.v20120308
2012- 03- 28  16: 35: 21.992:INFO:oejs.AbstractConnector:Started SelectChannelConnector@ 0.0. 0.0: 8080

可以看出这个方式和第一种、第二种完全相同。
另外start.jar提供了一种可以查看当前运行参数的命令:
java -jar start.jar --dry-run

可能输出:
/opt/apps/jdk/bin/java -Djetty.home=/opt/apps/jetty8 -cp /opt/apps/jetty8/resources:\
/opt/apps/jetty8/lib/jetty-xml- 8.1. 2.v20120308.jar:/opt/apps/jetty8/lib/servlet-api- 3.0.jar:\
/opt/apps/jetty8/lib/jetty-http- 8.1. 2.v20120308.jar:/opt/apps/jetty8/lib/jetty-continuation- 8.1. 2.v20120308.jar:\
/opt/apps/jetty8/lib/jetty-server- 8.1. 2.v20120308.jar:/opt/apps/jetty8/lib/jetty-security- 8.1. 2.v20120308.jar:\
/opt/apps/jetty8/lib/jetty-servlet- 8.1. 2.v20120308.jar:/opt/apps/jetty8/lib/jetty-webapp- 8.1. 2.v20120308.jar:\
/opt/apps/jetty8/lib/jetty-deploy- 8.1. 2.v20120308.jar:/opt/apps/jetty8/lib/jetty-servlets- 8.1. 2.v20120308.jar:\
/opt/apps/jetty8/lib/jetty-util- 8.1. 2.v20120308.jar:/opt/apps/jetty8/lib/jetty-io- 8.1. 2.v20120308.jar \
org.eclipse.jetty.xml.XmlConfiguration /tmp/start1059041541723976621.properties /opt/apps/jetty8/etc/jetty.xml

有意思的是这里有一个临时文件:/tmp/start1059041541723976621.properties,里面记录了所有系统属性,也就是类似System.getProperties()。
除非是嵌入式开发,否则我们都是用start.jar来启动jetty。

命令参数

start.jar提供了大量的参数来负责启动JVM。
下面命令列出所有的命令行参数:
java -jar start.jar --help

现在问题来了,这些默认的参数都是哪来的?例如,如果想改变 ${jetty.home}又怎样?
jetty内部默认提供了一个默认的配置文件 start.config来解决此问题。
默认情况下start.jar里面带有一个默认的start.config文件,这个文件有一些预置的定义。
[adyliu @adyliu-pc jetty8]$ jar tvf start.jar |  grep start.config
   8669 Fri Mar  09  00: 13: 12 CST  2012 org/eclipse/jetty/start/start.config

start.config
 文件内容非常大,其中大部分是注释。

start.config的作用有以下几个:

  • 定义jetty.home属性
  • 定义jetty启动类
  • 定义jetty启动的默认配置文件
  • 定义OPTIONS
  • 根据OPTIONS来定义classpath

上面特别提到OPTIONS。什么是OPTIONS?

OPTIONS

由于jetty是高度可定制的,因此jetty将各个模块拆分成各个非常细小的模块。每一个模块(实际上是一个个的jar包),我们可以简单的看出是一个OPTION。而每一个OPTION都会对应于实际的jar,这就决定了这些jar包是否需要加入classpath,并且在jetty启动的时候是否需要做一些额外的事情。

start.config文件的语法也挺有意思的。支持一些简单的逻辑判断,例如文件是否存在、命令行参数是否存在等。

默认情况下有如下配置:

  • path参数的值加入classpath
  • lib参数的值作为目录搜索jar包,其中的jar/zip包加入classpath
  • 默认的启动类是org.eclipse.jetty.xml.XmlConfiguration.class,除非定义了start.class属性
  • 默认的jetty配置文件是$(jetty.home)/etc/jetty.xml,除非传入的参数不为空
  • 默认${jetty.home}目录是当前目录(不一定是start.jar所在路径)。${jetty.home}属性搜索顺序有:
    • $(jetty.home) 参数或者系统属性(包括环境变量)
    • . 当前路径
    • .. 当前路径的父路径
    • jetty-distribution/src/main/resources 当前路径的发行版子路径
    • ../jetty-distribution/src/main/resources 当前路径的父路径的发行版子路径
  • 默认的classpath有:
    • resources
    • lib/jetty-xml-8.1.2.v20120308.jar
    • lib/servlet-api-3.0.jar
    • lib/jetty-http-8.1.2.v20120308.jar
    • lib/jetty-continuation-8.1.2.v20120308.jar
    • lib/jetty-server-8.1.2.v20120308.jar
    • lib/jetty-security-8.1.2.v20120308.jar
    • lib/jetty-servlet-8.1.2.v20120308.jar
    • lib/jetty-webapp-8.1.2.v20120308.jar
    • lib/jetty-deploy-8.1.2.v20120308.jar
    • lib/jetty-servlets-8.1.2.v20120308.jar
    • lib/jetty-util-8.1.2.v20120308.jar
    • lib/jetty-io-8.1.2.v20120308.jar

start.jar参数

我们再来看start.jar支持的参数:

[adyliu @adyliu-pc jetty8] #  java -jar start.jar --help
Usage: java -jar start.jar [options ] [properties ] [configs ]

options

其中options列表(这指的是命令行参数,不是模块,由此可见jetty将内置的OPTIONS定义为模块多好)有:

  • --version 列出版本号
  • --list-options 列出当前start.config支持的所有OPTIONS
  • --list-config 列出当前start.config内容(文本内容)
  • --dry-run 列出当前配置要启动的java进程完整参数(不启动jetty服务)
  • --exec 启动子进程(只有启动子进程才能修改-X,-D等参数,因为start.jar本身就是依靠java进程启动的,不能在运行时改变)
  • --stop 停止运行的jetty实例
  • --daemon 后台运行jetty,启动将stdout/stderr记录到${jetty.log}/start.log中(好了,这个变量jetty.log没有默认配置说明,估计是${jetty.home}/logs目录)
  • --config=<file> 指定特别的start.config,以便覆盖内置的start.config.(经过测试,如果指定此文件,那么内置的配置将不再读取,这导致必须将所有配置写全,包括mainclass/jetty config/OPTIONS等)
  • --ini=<file> 从配置文件中装载命令行参数。上面参数以及下面提到的参数是在太多,可以从配置文件中一次性加载,默认的配置文件是${jetty.home}/start.ini。
  • --pre=<file> 指定特别的jetty运行配置文件,这个配置文件在后面提高的配置文件前面运行,相当于改变默认的装载机制。
properties

属性分成两种,一种是会传递给系统属性(java.lang.System#getProperty(String)),一种只是作为jetty的启动参数。

如果要传递给系统属性,则格式是: -Dname=value,和java进程系统属性类似。

jetty也有一些默认的系统属性:

属性类型描述
org.eclipse.jetty.util.log.classclassjetty日志记录,默认为:org.eclipse.jetty.util.log.Slf4jLog
org.eclipse.jetty.util.log.DEBUGboolean调试日志输出地方,默认为stderr和java内置的Logger,如果是其他日志则需要设置为true,默认为false
org.eclipse.jetty.util.log.IGNOREDboolean是否记录一些忽略的错误日志,默认为false
org.eclipse.jetty.util.log.SOURCEboolean记录错误日志行号?位置?默认为false
com.sun.management.jmxremote 启动jmx管理

jetty的启动参数属性,格式是: name=value,注意这里没有-D了。这些参数不会传递给系统属性。

所有参数列表:

  • path=[directory]: 传递额外的classpath,参考上面默认的start.config配置
  • lib=[directory]: 传递额外classpath搜索jar/zip的目录
  • STOP.PORT=[number]: 停止jetty的端口(远程管理)
  • STOP.KEY=[alphanumeric]: 停止jetty的密码(远程管理)
  • DEBUG=true: 是否启动调试模式,同时会设置org.eclipse.jetty.util.log.DEBUG属性为true,默认为false
  • OPTIONS=[option,option...]: OPTION列表,也就是要启动的模块列表。

在内置的start.config中默认的OPTIONS列表有:

  • All
  • Client
  • Server
  • ajp
  • annotations
  • client
  • default
  • deploy
  • ext
  • jmx
  • jndi
  • jsp
  • jta
  • monitor
  • overlay
  • overlays
  • plus
  • policy
  • resources
  • rewrite
  • security
  • server
  • servlet
  • servlets
  • setuid
  • webapp
  • websocket
  • xml
configs

jetty运行需要一些配置文件,这些配置文件对应于不同的OPTION所需要的配置。

默认的jetty配置存在都存在于${jetty.home}/etc中,所有配置文件列表有:

  • etc/jetty-ajp.xml
  • etc/jetty-annotations.xml
  • etc/jetty-bio-ssl.xml
  • etc/jetty-bio.xml
  • etc/jetty-contexts.xml
  • etc/jetty-debug.xml
  • etc/jetty-deploy.xml
  • etc/jetty-fileserver.xml
  • etc/jetty-ipaccess.xml
  • etc/jetty-jmx.xml
  • etc/jetty-logging.xml
  • etc/jetty-monitor.xml
  • etc/jetty-overlay.xml
  • etc/jetty-plus.xml
  • etc/jetty-policy.xml
  • etc/jetty-proxy.xml
  • etc/jetty-requestlog.xml
  • etc/jetty-rewrite.xml
  • etc/jetty-ssl.xml
  • etc/jetty-stats.xml
  • etc/jetty-testrealm.xml
  • etc/jetty-webapps.xml
  • etc/jetty-xinetd.xml
  • etc/jetty.xml

这么多配置,如何记得住?该使用哪些配置?

下一个章节中介绍配置文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值