一、不使用jetty.xml配置文件启动
package hb.test.jetty; import java.io.FileNotFoundException; import java.io.IOException; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.webapp.WebAppContext; import org.xml.sax.SAXException; public class SimpleServerStart { public static void main(String[] args) { try { // 服务器的监听端口 Server server = new Server(8080); // 关联一个已经存在的上下文 WebAppContext context = new WebAppContext(); // 设置描述符位置 context.setDescriptor("./web/WEB-INF/web.xml"); // 设置Web内容上下文路径 context.setResourceBase("./web"); // 设置上下文路径 context.setContextPath("/myproject"); context.setParentLoaderPriority(true); server.setHandler(context); // 启动 server.start(); server.join(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
二、通过配置文件启动jetty
package hb.test.jetty; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.webapp.WebAppContext; import org.eclipse.jetty.xml.XmlConfiguration; import org.xml.sax.SAXException; public class SimpleServerConfig { public static void main(String[] args) { try { // 创建一个默认服务器对象 Server server = new Server(); // server.setHandler(new DefaultHandler()); // 初始化server对象的属性,这些属性全部来至于xmlconfig文件的配置,有点类似于spring通过配置文件获取对象 XmlConfiguration config = new XmlConfiguration(new FileInputStream("./jetty/etc/jetty.xml")); config.configure(server); // 给创建的server服务器配置处理的handler对象,可以通过xmlconfig配置,也可以手动配置,下面代码是手动配置完成的 ContextHandlerCollection handler = new ContextHandlerCollection(); // 创建一个webapp对象 WebAppContext webapp = new WebAppContext(); // 一定要有反斜杠,表示当前工程的上下文 webapp.setContextPath("/myjetty"); webapp.setDefaultsDescriptor("./jetty/etc/webdefault.xml"); webapp.setResourceBase("./web"); webapp.setDescriptor("./web/WEB-INF/web.xml"); handler.addHandler(webapp); server.setHandler(handler); server.start(); server.join(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
配置jetty.xml文件,使用jetty9,需要添加如下标签。
<Call name="addConnector"> <Arg> <New class="org.eclipse.jetty.server.ServerConnector"> <Arg name="server"><Ref refid="Server" /></Arg> <Arg name="factories"> <Array type="org.eclipse.jetty.server.ConnectionFactory"> <Item> <New class="org.eclipse.jetty.server.HttpConnectionFactory"> <Arg name="config"><Ref refid="httpConfig" /></Arg> </New> </Item> </Array> </Arg> <Set name="host"><Property name="jetty.host" /></Set> <Set name="port"><Property name="jetty.port" default="8080" /></Set> <Set name="idleTimeout">30000</Set> </New> </Arg> </Call>
<?xml version="1.0"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd"> <!-- =============================================================== --> <!-- Documentation of this file format can be found at: --> <!-- http://wiki.eclipse.org/Jetty/Reference/jetty.xml_syntax --> <!-- --> <!-- Additional configuration files are available in $JETTY_HOME/etc --> <!-- and can be mixed in. See start.ini file for the default --> <!-- configuration files. --> <!-- --> <!-- For a description of the configuration mechanism, see the --> <!-- output of: --> <!-- java -jar start.jar -? --> <!-- =============================================================== --> <!-- =============================================================== --> <!-- Configure a Jetty Server instance with an ID "Server" --> <!-- Other configuration files may also configure the "Server" --> <!-- ID, in which case they are adding configuration to the same --> <!-- instance. If other configuration have a different ID, they --> <!-- will create and configure another instance of Jetty. --> <!-- Consult the javadoc of o.e.j.server.Server for all --> <!-- configuration that may be set here. --> <!-- =============================================================== --> <Configure id="Server" class="org.eclipse.jetty.server.Server"> <!-- =========================================================== --> <!-- Configure the Server Thread Pool. --> <!-- The server holds a common thread pool which is used by --> <!-- default as the executor used by all connectors and servlet --> <!-- dispatches. --> <!-- --> <!-- Configuring a fixed thread pool is vital to controlling the --> <!-- maximal memory footprint of the server and is a key tuning --> <!-- parameter for tuning. In an application that rarely blocks --> <!-- then maximal threads may be close to the number of 5*CPUs. --> <!-- In an application that frequently blocks, then maximal --> <!-- threads should be set as high as possible given the memory --> <!-- available. --> <!-- --> <!-- Consult the javadoc of o.e.j.util.thread.QueuedThreadPool --> <!-- for all configuration that may be set here. --> <!-- =========================================================== --> <Arg name="threadpool"> <New id="threadpool" class="org.eclipse.jetty.util.thread.QueuedThreadPool"> <Arg name="minThreads" type="int">10</Arg> <Arg name="maxThreads" type="int">200</Arg> <Arg name="idleTimeout" type="int">60000</Arg> <Set name="detailedDump">false</Set> </New> </Arg> <!-- =========================================================== --> <!-- Add shared Scheduler instance --> <!-- =========================================================== --> <Call name="addBean"> <Arg> <New class="org.eclipse.jetty.util.thread.ScheduledExecutorScheduler"/> </Arg> </Call> <!-- =========================================================== --> <!-- Http Configuration. --> <!-- This is a common configuration instance used by all --> <!-- connectors that can carry HTTP semantics (HTTP, HTTPS, SPDY)--> <!-- It configures the non wire protocol aspects of the HTTP --> <!-- semantic. --> <!-- --> <!-- This configuration is only defined here and is used by --> <!-- reference from the jetty-http.xml, jetty-https.xml and --> <!-- jetty-spdy.xml configuration files which instantiate the --> <!-- connectors. --> <!-- --> <!-- Consult the javadoc of o.e.j.server.HttpConfiguration --> <!-- for all configuration that may be set here. --> <!-- =========================================================== --> <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration"> <Set name="secureScheme">https</Set> <Set name="securePort"><Property name="jetty.secure.port" default="8443" /></Set> <Set name="outputBufferSize">32768</Set> <Set name="requestHeaderSize">8192</Set> <Set name="responseHeaderSize">8192</Set> <Set name="sendServerVersion">true</Set> <Set name="sendDateHeader">false</Set> <Set name="headerCacheSize">512</Set> <!-- Uncomment to enable handling of X-Forwarded- style headers <Call name="addCustomizer"> <Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg> </Call> --> </New> <Call name="addConnector"> <Arg> <New class="org.eclipse.jetty.server.ServerConnector"> <Arg name="server"><Ref refid="Server" /></Arg> <Arg name="factories"> <Array type="org.eclipse.jetty.server.ConnectionFactory"> <Item> <New class="org.eclipse.jetty.server.HttpConnectionFactory"> <Arg name="config"><Ref refid="httpConfig" /></Arg> </New> </Item> </Array> </Arg> <Set name="host"><Property name="jetty.host" /></Set> <Set name="port"><Property name="jetty.port" default="8080" /></Set> <Set name="idleTimeout">30000</Set> </New> </Arg> </Call> <!-- =========================================================== --> <!-- Set the default handler structure for the Server --> <!-- A handler collection is used to pass received requests to --> <!-- both the ContextHandlerCollection, which selects the next --> <!-- handler by context path and virtual host, and the --> <!-- DefaultHandler, which handles any requests not handled by --> <!-- the context handlers. --> <!-- Other handlers may be added to the "Handlers" collection, --> <!-- for example the jetty-requestlog.xml file adds the --> <!-- RequestLogHandler after the default handler --> <!-- =========================================================== --> <Set name="handler"> <New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection"> <Set name="handlers"> <Array type="org.eclipse.jetty.server.Handler"> <Item> <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/> </Item> <Item> <New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/> </Item> </Array> </Set> </New> </Set> <!-- =========================================================== --> <!-- extra server options --> <!-- =========================================================== --> <Set name="stopAtShutdown">true</Set> <Set name="stopTimeout">5000</Set> <Set name="dumpAfterStart">false</Set> <Set name="dumpBeforeStop">false</Set> </Configure>
三,自定义server启动jetty
package hb.test.jetty; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import org.apache.commons.lang.StringUtils; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.webapp.WebAppContext; import org.eclipse.jetty.xml.XmlConfiguration; import org.xml.sax.SAXException; public class JettyCustomServer extends Server { private String xmlConfigPath; private String contextPath; private String warPath; private String resourceBase = "./web"; private String webXmlPath = "./web/WEB-INF/web.xml"; public JettyCustomServer(String xmlConfigPath, String contextPath, String resourceBase, String webXmlPath) { this(xmlConfigPath, contextPath, resourceBase, webXmlPath, null); } public JettyCustomServer(String xmlConfigPath, String contextPath) { this(xmlConfigPath, contextPath, null, null, null); } public JettyCustomServer(String xmlConfigPath, String contextPath, String warPath) { this(xmlConfigPath, contextPath, null, null, warPath); } public JettyCustomServer(String xmlConfigPath, String contextPath, String resourceBase, String webXmlPath, String warPath) { super(); if (StringUtils.isNotBlank(xmlConfigPath)) { this.xmlConfigPath = xmlConfigPath; readXmlConfig(); } //判断是否是根据jetty的发布目录启动工程 if (StringUtils.isNotBlank(warPath)) { this.warPath = warPath; if (StringUtils.isNotBlank(contextPath)) { this.contextPath = contextPath; applyHandle(true); } } else {//自定义web工程的上下文及工程所在的位置 if (StringUtils.isNotBlank(resourceBase)) this.resourceBase = resourceBase; if (StringUtils.isNotBlank(webXmlPath)) this.webXmlPath = webXmlPath; if (StringUtils.isNotBlank(contextPath)) { this.contextPath = contextPath; applyHandle(false); } } } /** * * @param warDeployFlag */ public void applyHandle(Boolean warDeployFlag) { ContextHandlerCollection handler = new ContextHandlerCollection(); WebAppContext webapp = new WebAppContext(); webapp.setContextPath(contextPath); webapp.setDefaultsDescriptor("./jetty/etc/webdefault.xml"); if (!warDeployFlag) { webapp.setResourceBase(resourceBase); webapp.setDescriptor(webXmlPath); } else { webapp.setWar(warPath); } handler.addHandler(webapp); super.setHandler(handler); } public void readXmlConfig() { try { XmlConfiguration config = new XmlConfiguration(new FileInputStream( this.xmlConfigPath)); config.configure(this); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } public void startServer() { try { super.start(); System.out.println("current thread:" + super.getThreadPool().getThreads() + "| idle thread:" + super.getThreadPool().getIdleThreads()); super.join(); } catch (Exception e) { e.printStackTrace(); } } public String getXmlConfigPath() { return xmlConfigPath; } public void setXmlConfigPath(String xmlConfigPath) { this.xmlConfigPath = xmlConfigPath; } public String getContextPath() { return contextPath; } public void setContextPath(String contextPath) { this.contextPath = contextPath; } public String getWarPath() { return warPath; } public void setWarPath(String warPath) { this.warPath = warPath; } public String getResourceBase() { return resourceBase; } public void setResourceBase(String resourceBase) { this.resourceBase = resourceBase; } public String getWebXmlPath() { return webXmlPath; } public void setWebXmlPath(String webXmlPath) { this.webXmlPath = webXmlPath; } }
package hb.test.jetty; public class JettyServerStart { public static void main(String[] args) { JettyCustomServer server = new JettyCustomServer("./jetty/etc/jetty.xml","/testContext"); server.startServer(); } }