xylz,imxylz

关注后端架构、中间件、分布式和并发编程

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  111 随笔 :: 10 文章 :: 2680 评论 :: 0 Trackbacks
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.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 |求贤若渴
posted on 2012-03-28 19:02 imxylz 阅读(28323) 评论(2)  编辑  收藏 所属分类: Jetty

评论

# re: [深入浅出Jetty 04]Jetty的启动方式 2012-03-30 07:50 tb
恩 学习了   回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航:
 

©2009-2014 IMXYLZ