前面的文章中提到了如何嵌入式的使用Jetty,也就是通过自己编写main函数,建立server,并且让server加载war或者为server编写handler。这里的方式和Tomcat等服务器相似,将编写好的webapp放置到特定的目录下面,由容器自动去添加webapp。
1、jetty-web.xml
每一个webapp都可以添加一个jetty-web.xml文件。这个文件用于配置org.eclipse.jetty.webapp.WebAppContext,也就是webapp的上下文。
jetty-web.xml的格式如下,顶级元素是<Configure>。
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
..
</Configure>
2、jetty.xml
jetty.xml用于配置jetty。不是针对某个特定的webapp。
主要进行如下的配置:
- the Server class (or subclass if extended) and global options
- a ThreadPool (min & max thread)
- connectors (ports, timeouts, buffer sizes, protocol, etc.)
- the handler structure (default handlers and/or a contextHandlerCollections, etc.)
- the deployment manager that scans for and deploys webapps and contexts
- login services that provides authentication checking
- a request log
默认的jetty.xml文件在jetty根目录下的etc文件夹中。同时这个文件夹中,还有其他许多的样例文件。用于开启不同的功能
3、jetty-env.xml
用于JNDI资源的定义,比如数据库资源。
4、start.ini
启动的配置。
1)JVM参数
在start.ini中已经配置好了一些推荐的VM参数,不过都是注释掉的。需要自己手动开启。
<span style="font-size:14px;"> --exec
-Dorg.apache.jasper.compiler.disablejsr199=true
-Dcom.sun.management.jmxremote
-Dorg.eclipse.jetty.util.log.IGNORED=true
-Dorg.eclipse.jetty.LEVEL=ERROR //日志级别,默认是DEBUG,这里修改为ERROR
-Dorg.eclipse.jetty.util.log.stderr.SOURCE=true
-Xmx1024m
-Xmn512m
-verbose:gc //开始日志,打印GC情况
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-XX:+PrintTenuringDistribution
-XX:+PrintCommandLineFlags
-XX:+DisableExplicitGC //-XX:+DisableExplicitGC标志自动将System.gc()调用转换成一个空操作
-XX:+UseConcMarkSweepGC //使用CMS
-XX:ParallelCMSThreads=2 //并发线程数
-XX:+CMSClassUnloadingEnabled //允许CMS 收集方法区 (PermGen)
-XX:+UseCMSCompactAtFullCollection //在Full垃圾回收时采用CMS压缩算法
-XX:CMSInitiatingOccupancyFraction=80 //CMS启动阈值</span>
2)启动模块
启动模块的方式是,
etc/xxxx.xml
比如想要启动JMX监控模块,etc/jetty-jmx.xml
5、例子
a)建立工程
b)配置jetty-web.xml,如下
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Call class="org.eclipse.jetty.util.log.Log" name="debug"><Arg>executing jetty-web.xml</Arg></Call>
<Set name="contextPath">/webapp1</Set>
</Configure>
c)打包war
d)将打包好的war包放置到jetty根目录下的webapps目录下
e)运行
直接使用java -jar start.jar运行时,会出现问题,
org.apache.jasper.JasperException: PWC6345: There is an error in invoking javac. A full JDK (not just JRE) is required
at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:92)
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:378)
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:119)
at org.apache.jasper.compiler.Jsr199JavaCompiler.compile(Jsr199JavaCompiler.java:208)
at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:384)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:453)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:625)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:575)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:276)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:103)
at org.eclipse.jetty.servlet.DefaultServlet.doGet(DefaultServlet.java:572)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:735)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:533)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handle(Server.java:370)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
at java.lang.Thread.run(Unknown Source)
解决方法
"C:\Program Files\Java\jdk1.7.0_09\bin\java" -jar start.jar
在运行java的时候,指定java.exe的目录。
f)在浏览器输入
http://localhost:8080/webapp1/