Jetty简介:
Jetty是一个优秀的Servlet引擎,一个著名的java开源项目,隶属于Eclipse基金会。相比于tomcat,Jetty更加轻量级也更加灵活,它使用Handler作为基本数据模型,所有的扩展性组件都可以以Handler的形式添加到Server中,因此非常容易实现定制化和功能扩展。Jetty是模块化设计的,使用Jetty的时候可以选择性的使用一些组件而禁用一些不必要的组件来减少内存的占用;Jetty的名言:
Don’t deploy your application in Jetty, deploy Jetty in your application
也说明了Jetty部署的灵活性。
目前Jetty的最新稳定版是9.3,发布于2015年,支持Servlet 3.1和JSP 2.3标准,支持HTTP/1.1 (RFC 7230), HTTP/2 (RFC 7540), WebSocket (RFC 6455, JSR 356), FastCGI等协议标准。
下载Jetty
下载Jetty:https://www.eclipse.org/jetty/download.html
最新稳定版是 9.3.11.v20160721
下载 .zip 文件,解压。得到如下目录结构,各目录/文件说明如下:
bin/ 含有 .sh 脚本工具,用于Unix类系统上运行Jetty
demo-base/ 运行demo程序的一个目录
etc/ Jetty的XML配置文件目录
lib/ Jetty运行所需的所有Jar文件都在改目录
logs/ log目录
modules/ 定义Jetty模块的目录
resources/ Jetty所需的一些资源文件目录,如log4j的配置文件
webapps/ Jetty默认配置下的webapp目录
lincese-eplv10-aslv20.html Jetty的Lincese文件
notice.html 注意事项
README.TXT Jetty使用简介
start.ini 启动配置文件
start.jar Jetty启动入口程序
VERSION.TXT 版本信息
启动Jetty
在上述解压的目录中打开命令行,使用 Java –jar start.jar
即可启动jetty。
打开浏览器访问http://localhost:8080,可以看到 404 错误页面,证明Jetty启动成功。
回到命令行窗口,查看启动过程中的信息提出,其中会有这么一个警告:
WARN:oejs.HomeBaseWarning:main: This instance of Jetty is not running from a separate {jetty.base} directory, this is not recommended. See documentation at http://www.eclipse.org/jetty/documentation/current/startup.html
这里将Jetty解压出来的根目录称为 $JETTY_HOME
,这个警告信息提示:不建议在$JETTY_HOME
直接启动Jetty。根据官方文件,Jetty建议使用一个独立的目录独立的配置文件启动Jetty,下文将这个独立的目录称为 JettyBase
。
下文中的命令都是Linux下的命令,如果是Windows请自行替换,如Windows下的环境变量用%var%而不是$var,拷贝命令是copy而不是cp
上面展示Jetty的目录结构中有一个demo-base目录,现在将这个目录作为Jetty Base目录,进入该目录,在这个目录启动Jetty:java -jar $JETTY_HOME/start.jar
然后再访问http://localhost:8080 即可看到Jetty的欢迎页面。
配置Jetty
前文提到,Jetty是模块化设计的,使用Jetty时我们可以有选择的启动或者禁用一些模块。查看当前$JETTY_BASE
的模块信息:
//列出所有的模块和当前已启用的模块以及模块的依赖关系等信息
cd $JETTY_HOME/demo-base/
java -jar $JETTY_HOME/start.jar --list-modules
//查看当前$JETTY_BASE的配置信息:
java -jar %JETTY_HOME/start.jar --list-config
创建一个新的JettyBase
一个Jetty Base 目录可以为Jetty服务器提供一份独立的运行环境和配置信息。Jetty服务器默认配置有以下两个属性:
jetty.home
该属性定义了Jetty 部署的位置信息,包括libs,默认开启模块信息、默认XML配置等jetty.base
该属性定义了一个特定服务器实例的位置信息,包括它的配置、webapp、logs等信息.
上述两个属性都可以通过命令行进行设置和查看。对应环境变量$JETTY_HOME
和$JETTY_BASE
。
使用以下命令可以创建一个Jetty Base目录,并向该JettyBase添加HTTP模块和deploy模块。
JETTY_BASE=/tmp/mybase
mkdir $JETTY_BASE
cd $JETTY_BASE
java -jar $JETTY_HOME/start.jar --add-to-startd=http,deploy
// 从demo-base拷贝webapp到该JettyBase并启动Jetty。
cp $JETTY_HOME/demo-base/webapps/async-rest.war webapps/ROOT.war
java -jar $JETTY_HOME/start.jar
指定Jetty启动端口
java -jar $JETTY_HOME/start.jar jetty.http.port=8081
此外,还可以start.ini或者start.d/http.ini配置文件中指定端口jetty.http.port信息。
- start.d/http.ini文件中的所有配置都将作为http模块的命令行参数传入。
- http模块modules/http.mod文件指定了http模块的定义xml文件(etc/jetty-http.xml)和http模块的参数模块(http.ini)
- etc/jetty-http.xml文件根据参数jetty.http.port属性想HttpContector注入端口信息。
启用https和http2
启用https和http2,启动jetty并配置端口为8444
//添加模块
java -jar $JETTY_HOME/start.jar --add-to-startd=https,http2
//启动Jetty并指定端口
java -jar $JETTY_HOME/start.jar jetty.ssl.port=8444
- –add-to-startd 参数会将配置信息加入start.d目录下对应文件中
- –add-to-start 参数会将配置信息加入 start.ini 文件中
使用命令java -jar $JETTY_HOME/start.jar –help
获取帮助信息
Jetty部署web项目
Jetty Server启动后会检查 JettyBase/webapps目录下的webapp并自根据配置自动部署webapp。
Deploy说明:
- 对目录的部署:如果webapps目录下有example/目录,Jetty会在example目录下寻找WEB-INF/目录,如果存在该目录则会将该app部署为标准webapp,如果不存在则部署为静态web项目。可以通过http://localhost:8080/example访问。如果目录名以
.d
结尾(如example.d目录)则忽略该目录(不进行deploy)。 - 对war包的部署:如果webapps目录下存在example.war,则对war包进行解压并部署,如果同时存在example.war和example/目录,则只部署example.war。
- 对xml文件的部署:如果存在example.xml,则根据该xml文件的配置进行部署,xml文件必须配置context path。如果同时存在example.xml,example.war和example/目录,则xml文件的部署优先级最高,同名的war包和目录会被部署器忽略。
- 对于ROOT/目录或者ROOT.war则部署之后的Contextpath为
“/”
(war包优先部署)