jetty源码下载
① jetty-6.1.9 怎么配置jdk
1. 首先从Jetty的官方网站wiki.eclipse.org/Jetty/Starting/Downloads下载最新的Jetty,上面有两个版本7.x和8.x,7.x是运行在JDK5及以上版本,8.x,9.x是运行在JDK6及以上版本,这里我选择了8.0.4版本。
2. 解压压缩包到指定目录,且将其目录路径定义为${JETTY_HOME}
3. 启动Jetty服务
3.1 进入${JETTY_HOME}目录,然后运行“java -jar start.jar”,就可以启动Jetty server了
3.2 打开浏览器,访问localhost:8080,此时可以看到Jetty的欢迎页面了。
4. Jetty配置
4.1 Jetty的配置文件都是放在${JETTY_HOME}/etc目录下;
4.2 通过${JETTY_HOME}/etc/jetty-webapps.xml文件,可以看出Jetty中默认将所有的web app都放在了${JETTY_HOME}/webapps目录下;(备注:9.x版本是${JETTY_HOME}/etc/webdefault.xml)
4.3 在Jetty包中默认带了一个test.war的应用,可以${JETTY_HOME}/webapps目录下找到这个文件,在启动Jetty服务的时候默认已经部署了test.war应用。对于test.war文件,Jetty还定义了context文件,放在${JETTY_HOME}/contexts/test.xml,其中将contextPath定义成了“/”,这就是为什么默认访问localhost:8080/的时候为什么是访问test应用的原因了。
② is only available on Java 1.5 and highe
1. eclipse 下载安装
这个就是最新版本就行,没啥特殊的,安装完毕,写个HelloWorld能跑就行
2. 安装配置运行jetty
下载最新版本jetty,解压缩就行
3. 安装eclipse的jetty插件
eclipse integration plugin,地址如下,各种安装,eclipse market,配置说明都在这里(最省事的安装就是从eclipse market页面直接拖拽install按钮到eclipse界面)
http://eclipse-jetty.github.io/installation.html
4. 配置jdk
因为要支持jsp,因此需要包含java编译器的运行时jre,普通的jre是不包含编译功能的,因此,需要在eclipse->window->preferences->java->installed jre中添加jdk目录下的jre
5. 新建web项目
这个跟着eclipse的向导走就行了,没啥特殊的(编译时的jre,用啥都无所谓)
6. 运行含有jsp的web项目
第一次,需要run configuration
左边的Jetty Webapp选择添加
第一个标签WebApp,按照自己项目的实际目录填写就好,默认是按照maven项目目录规范来的,如果找不到,会报错,run按钮无法点击
第三个标签Options,Use Jetty at path ,选择jetty解压缩目录就行,插件会自行检测jetty版本
第五个标签JRE,这里选择的是jetty运行时的jre,需要选择JDK的jre,alternate JRE选择前面设置的就可以
这些都设置好了之后,应该就可以run了
常见的错误
1. no jsp support,用了这个插件,一般不会遇到这个问题,jetty默认启动不支持jsp,需要配置,用了这个插件在Options标签可以随意选择,这个问题就不是问题了(No JSP support. Check that JSP jars are in lib/jsp and that the JSP option has been specified to start.jar)
2. full jdk required,这个是JRE标签里的jre/javaw,不是JDK里的,导致运行时出问题,这个可以通过console的输出和console的标题来检查(There is an error in invoking javac. A full JDK (not just JRE) is required)
3. ClassNotFound,这个问题有可能是因为缺少依赖的包,还有可能是因为你的Lib里jar太多了,比如混入了tomcat,jetty其它版本的jar,导致jetty初始化某些logger,servlet接口的时候,找的不是当前jetty里的实现,而是那些乱七八糟jar依赖的实现,然后找不到了。根据情况,先把乱七八糟的jar干掉,然后在一点点添加。
③ 如何让嵌入式Jetty加载Spring WebApplicationInitializer
使用Jetty的嵌入式API,可以将J2EE容器嵌入你的Application中,更进一步的是,采用Servlet 3.0的标准,你甚至可以省掉web.xml的配置文件,因此Spring提供了类 。但是在实际开发中,发现Jetty的嵌入式API默认情况下只加载WEB-INF/lib/或者WEB-INF/classes中的类。通过阅读Jetty的源代码,找到一个解决方法,代码如下:
WebAppContext context = new WebAppContext();
context.setContextPath("/");
context.setBaseResource(Resource.newClassPathResource("META-INF/webapp"));
MetaData metaData = _ctx.getMetaData();
Resource webappInitializer = Resource.newResource(WebApp.class.getProtectionDomain().getCodeSource().getLocation());
metaData.addContainerResource(webappInitializer);
AnnotationConfiguration config = new AnnotationConfiguration();
context.setConfigurations(new Configuration[] { config });
List<Handler> handlers = new ArrayList<Handler>();
handlers.add(context);
HandlerList handlerList = new HandlerList();
handlerList.setHandlers(handlers.toArray(new Handler[0]));
HandlerCollection handlerCollection = new HandlerCollection();
handlerCollection.setHandlers(new Handler[] { handlerList });
Server server = new Server(8888);
server.setHandler(handlerCollection);
server.setStopAtShutdown(true);
server.start();
server.join();
关键就是下面两句:
MetaData metaData = _ctx.getMetaData();
Resource webappInitializer = Resource.newResource(WebApp.class.getProtectionDomain().getCodeSource().getLocation());
metaData.addContainerResource(webappInitializer);
由于Jetty本身代码的原因,WebApplicationInitializer的实现必须直接实现接口,不能继承 。
public class WebApp implements WebApplicationInitializer {
@Override
public void onStartup(final ServletContext servletContext)
throws ServletException {
context = new ();
//..省略
}
另外,把webapp的内容放入"META-INF“下,同时打包到.jar文件,设置相应的路径为:
context.setBaseResource(Resource.newClassPathResource("META-INF/webapp"));
即可将你的webapp制作成一个可执行的.jar文件。顺便说一句,Nexus似乎就是这么干的。