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-
Length:
618
< 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}又怎样?
默认情况下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.class |
class |
jetty日志记录,默认为:org.eclipse.jetty.util.log.Slf4jLog |
org.eclipse.jetty.util.log.DEBUG |
boolean |
调试日志输出地方,默认为stderr和java内置的Logger,如果是其他日志则需要设置为true,默认为false |
org.eclipse.jetty.util.log.IGNORED |
boolean |
是否记录一些忽略的错误日志,默认为false |
org.eclipse.jetty.util.log.SOURCE |
boolean |
记录错误日志行号?位置?默认为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
这么多配置,如何记得住?该使用哪些配置?
下一个章节中介绍配置文件。
参考资源:
©2009-2014 IMXYLZ
|求贤若渴