除了极大方便嵌入式启动之外,从程序外部也非常好容易启动jetty。
[原文:http://www.blogjava.net/xylz/archive/2012/03/28/372923.html]
运行方式
运行方法1
首先我们以一个标准的jar程序启动来看待这个问题.#!/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 $*
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。测试一下:
* 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
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.ini,因为默认的配置文件会启动一个test.war环境。
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
可以看出这个方式和第一种、第二种完全相同。
可能输出:
/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()。
命令参数
现在问题来了,这些默认的参数都是哪来的?例如,如果想改变 ${jetty.home}又怎样?
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支持的参数:
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
这么多配置,如何记得住?该使用哪些配置?
下一个章节中介绍配置文件。