Jetty嵌入式Web容器指南.docx
- 文档编号:25202347
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:24
- 大小:23.05KB
Jetty嵌入式Web容器指南.docx
《Jetty嵌入式Web容器指南.docx》由会员分享,可在线阅读,更多相关《Jetty嵌入式Web容器指南.docx(24页珍藏版)》请在冰豆网上搜索。
Jetty嵌入式Web容器指南
Jetty嵌入式Web容器指南
Jetty是一个用Java实现、开源、基于标准的,并且具有丰富功能的Http服务器和Web容器。
Jetty中应用最广泛的一项功能就是可以作为嵌入式Web容器。
在开发阶段,可以使用Jetty在Eclipse里直接启动应用,而不是像Tomcat那样繁琐,先把几十兆应用打包,然后再复制到某个目录后再启动。
在测试阶段,可以直接在测试用例中启动Jetty,而不是先将应用打包部署到容器。
在运行阶段,可以将war包配置成直接能够运行的应用
本文将着重介绍如何配置使用Jetty的嵌入式Web容器功能,关于Jetty的基本配置和功能请参考
一、开发阶段
1、使用maven启动Jetty
我们修改了源码的时候eclipse会自动编译,JettyMavenPlugin插件发现编译文件有变化后会自动更新到jetty容器中,非常方便我们进行开发。
首先定义Jetty的版本属性
然后引入Jetty依赖
--jetty-->
配置JettyMavenPlugin插件,示例如下
该配置运行jetty并指定spring的profile为development,同时设定web应用的上下文地址与应用本身的artifactId一致。
执行如下命令启动Jetty,即可通过http:
//localhost:
8080/${project.artifactId}访问Web应用。
mvnjetty:
run
JettyMavenPlugin插件支持多个mavengoals,最常用的就是run,下面的参数支持大部分的goals
(1)配置Jetty容器(支持所有goals)
可选参数,配置org.eclipse.jetty.server.Connector(Jetty端口监听器)列表,如果不指定该参数,将会连接默认的8080端口。
可选参数,指定Jetty配置文件的路径
可选参数,配置Web应用扫描的暂停时间,Web应用扫描如果发现修改了程序,会自动重新部署。
该参数默认值为0,即不启动热部署
可选参数,设置插件执行时的系统参数,比如上面的配置示例中指定了spring的profile为development,如果不设置该参数,就需要配置maven与spring的profile一致,同时在mvn命令中增加-Pdevelopment选项,或者直接在spring配置文件中设置spring.profiles.active为development
可选参数,设置系统参数配置文件的位置,将会批量执行其中的系统参数配置
可选参数,配置org.eclipse.jetty.security.LoginService实现类的列表。
可选参数,配置请求日志接口:
org.eclipse.jetty.server.RequestLog的实现类,配置请求日志的处理格式,
比如org.mortbay.jetty.NCSARequestLog就是一个NCSA格式((美国)国家超级计算技术应用中心(NCSA)公用格式,是常用的标准日志格式)的实现。
(2)配置Web应用程序(不支持run-forked、stop两个goals)
从jetty6.1.6rc0起使用webAppConfig,web应用程序配置根节点
设置web应用程序的context路径,默认情况下,它被设置成该项目的pom.xml的
设置web应用程序主配置文件web.xml的路径,默认该配置文件位于WEB-INF目录下
设置先于web.xml执行的webdefault.xml配置文件的路径
设置在web.xml读取之后执行的配置文件,使用该参数可以覆盖或增加web.xml中的配置
Web应用的临时目录,Jetty可以在此目录编译jsp文件或者复制jar包,默认路径为${project.build.outputDirectory}/tmp
指定Web应用静态资源所在的路径,默认路径为src/main/webapp
指定多个Web应用静态资源所在的路径,使用逗号分隔
可选参数,默认值为true,控制是否可以在Web应用的原始资源之前或之后叠加多个war包
可选参数,指定jetty-env.xml配置文件的路径
jetty-8.1.x之后的版本可以使用,可选参数,配置加载到Jetty容器Classloader中的Jar包的路径或匹配模式,符合条件的jar包将会被检测META-INF、资源、tld和类的继承关系
jetty-8.1.x之后的版本可以使用,可选参数,配置加载到Web应用程序的Classloader(WEB-INFclasspath)中的Jar包的路径或匹配模式,符合条件的jar包将会被检测META-INF、资源、tld和类的继承关系
可选参数,指定contextxml配置文件的路径
rungoals将会启动Jetty并运行应用程序,不需要应用程序编译成war包。
另外run还支持webapp节点的其它属性:
Web应用程序类编译后的路径
Web应用程序单元测试类编译后的路径,默认值为${project.build.testOutputDirectory}.
Jetty-7之前的版本参数名称为useTestClasspath,如果设置为true,开启测试模式,
如果设置为true,依赖范围标示为“provided”的依赖将被加载到容器的classpath中,该参数很少使用。
Web应用程序静态资源路径,默认值为${basedir}/src/main/webapp
配置除了插件自动扫描的位置外,其它需要扫描的目录或文件列表
配置除了插件自动扫描的位置外,其它需要扫描的目录或文件的匹配模式
默认值为false,如果设置为true,将会停止执行插件
JettyMavenPlugin插件支持的其它goals简介如下(详见http:
//wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin):
run-war:
将Web应用程序打包成war包并部署到Jetty中。
run-exploded:
使用warexploded模式(文件夹模式)将Web应用程序打包并部署到Jetty中
deploy-war:
功能与run-war类似,区别就是maven生命周期中不包含package阶段
run-forked:
jetty-7.5.2之后的版本可用,强迫Jetty使用一个新的JVM启动应用程序
start:
jetty-7.6.0之后的版本可用,一般在配合插件中的execution节点使用,test-compile阶段之后才执行构建,确保必要的类及文件都生成好了。
一般用于集成测试时启动Jetty,本文第二部分测试阶段会有详细介绍
stop:
关闭运行中的Jetty容器
2、在java中启动Jetty
SpringSide4中封装了Jetty的操作提供了工具类JettyFactory,让我们可以很简单的启动Jetty容器,JettyFactory代码如下:
/**
*Copyright(c)2005-2012
*
*LicensedundertheApacheLicense,Version2.0(the"License");
*/
packageorg.springside.modules.test.jetty;
importjava.util.List;
importmons.lang3.StringUtils;
importorg.eclipse.jetty.server.Connector;
importorg.eclipse.jetty.server.Server;
importorg.eclipse.jetty.server.nio.SelectChannelConnector;
importorg.eclipse.jetty.webapp.WebAppClassLoader;
importorg.eclipse.jetty.webapp.WebAppContext;
importmon.collect.Lists;
/**
*创建JettyServer的工厂类.
*
*@authorcalvin
*/
publicclassJettyFactory{
privatestaticfinalStringDEFAULT_WEBAPP_PATH="src/main/webapp";
privatestaticfinalStringWINDOWS_WEBDEFAULT_PATH="jetty/webdefault-windows.xml";
/**
*创建用于开发运行调试的JettyServer,以src/main/webapp为Web应用目录.
*/
publicstaticServercreateServerInSource(intport,StringcontextPath){
Serverserver=newServer();
//设置在JVM退出时关闭Jetty的钩子。
server.setStopAtShutdown(true);
SelectChannelConnectorconnector=newSelectChannelConnector();
connector.setPort(port);
//解决Windows下重复启动Jetty居然不报告端口冲突的问题.
connector.setReuseAddress(false);
server.setConnectors(newConnector[]{connector});
WebAppContextwebContext=newWebAppContext(DEFAULT_WEBAPP_PATH,contextPath);
//修改webdefault.xml,解决Windows下JettyLock住静态文件的问题.
webContext.setDefaultsDescriptor(WINDOWS_WEBDEFAULT_PATH);
server.setHandler(webContext);
returnserver;
}
/**
*设置除jstl-*.jar外其他含tld文件的jar包的名称.
*jar名称不需要版本号,如sitemesh,shiro-web
*/
publicstaticvoidsetTldJarNames(Serverserver,String...jarNames){
WebAppContextcontext=(WebAppContext)server.getHandler();
List
for(StringjarName:
jarNames){
jarNameExprssions.add(".*/"+jarName+"-[^/]*\\.jar$");
}
context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
StringUtils.join(jarNameExprssions,'|'));
}
/**
*快速重新启动application,重载target/classes与target/test-classes.
*/
publicstaticvoidreloadContext(Serverserver)throwsException{
WebAppContextcontext=(WebAppContext)server.getHandler();
System.out.println("[INFO]Applicationreloading");
context.stop();
WebAppClassLoaderclassLoader=newWebAppClassLoader(context);
classLoader.addClassPath("target/classes");
classLoader.addClassPath("target/test-classes");
context.setClassLoader(classLoader);
context.start();
System.out.println("[INFO]Applicationreloaded");
}
}
JettyFactory包含三个方法
createServerInSource:
以src/main/webapp为Web应用目录创建JettyWebServer,确保jvm退出时关闭Jetty,在同一个端口启动多个jetty时报告端口冲突,并解决了javascript、css等静态文件被jetty锁定而不能修改的问题。
setTldJarNames:
Jetty,tomcat等web容器通常都会对classloader做扩展,Jetty中的org.mortbay.jetty.webapp.WebAppClassLoader负责加载一个Web应用context中的应用类。
Jetty的jsp处理引擎来自于Glassfish,要求JSF标签必须位于Jetty容器的classpath中,不能位于Web应用的classpath中,而Jetty的WebAppClassLoader优先使用父classloader加载类,导致tld文件都被加载到父classloader中,在Jetty的classpath中根本扫描不到,所以会出现找不到tld文件的情况。
setTldJarNames方法可以设置将包含tld的jar包加载到Jetty的classpath中。
reloadContext:
重新加载Jetty的context
调用JettyFactory在Jetty中运行调试MavenWeb应用的示例代码如下:
packageorg.springside.examples.quickstart;
importorg.eclipse.jetty.server.Server;
importorg.springside.modules.test.jetty.JettyFactory;
importorg.springside.modules.test.spring.Profiles;
/**
*使用Jetty运行调试Web应用,在Console输入回车快速重新加载应用.
*
*@authorcalvin
*/
publicclassQuickStartServer{
publicstaticfinalintPORT=8080;
publicstaticfinalStringCONTEXT="/quickstart";
publicstaticfinalString[]TLD_JAR_NAMES=newString[]{"sitemesh","spring-webmvc","shiro-web",
"springside-core"};
publicstaticvoidmain(String[]args)throwsException{
//设定Spring的profile
Profiles.setProfileAsSystemProperty(Profiles.DEVELOPMENT);
//启动Jetty
Serverserver=JettyFactory.createServerInSource(PORT,CONTEXT);
JettyFactory.setTldJarNames(server,TLD_JAR_NAMES);
try{
server.start();
System.out.println("[INFO]Serverrunningathttp:
//localhost:
"+PORT+CONTEXT);
System.out.println("[HINT]HitEntertoreloadtheapplicationquickly");
//等待用户输入回车重载应用.
while(true){
charc=(char)System.in.read();
if(c=='\n'){
JettyFactory.reloadContext(server);
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Jetty 嵌入式 Web 容器 指南