使用web.xml配置嵌入式jetty?

我试图用我的Web应用程序生成一个战争以及一个带有嵌入式jetty的自包含jar文件。 对于嵌入式jetty(jar文件分发),我添加一个servlet,如下所示:

public static void main(String[] args) throws Exception { Server server = new Server(8080); ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); server.setHandler(context); context.addServlet(new ServletHolder(new HelloServlet()),"/*"); server.start(); server.join(); } 

war文件分发使用web.xml文件,该文件在web-app部分中包含以下内容:

  com.example.HelloServlet SimplestServer   HelloServlet /*  

这很有效。 但是,我想摆脱两种方法之间的重复。 即,当我添加一个新的servlet时,我想要只在一个位置配置它。 我可以从嵌入式jetty加载和使用web.xml文件吗?

使用org.eclipse.jetty.webapp.WebAppContext

例:

 package jetty; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.webapp.WebAppContext; public class OnWebApp { public static void main(String[] args) throws Exception { // Create a basic jetty server object that will listen on port 8080. // Note that if you set this to port 0 then a randomly available port // will be assigned that you can either look in the logs for the port, // or programmatically obtain it for use in test cases. Server server = new Server(8080); // The WebAppContext is the entity that controls the environment in // which a web application lives and breathes. In this example the // context path is being set to "/" so it is suitable for serving // root context requests and then we see it setting the location of // the war. A whole host of other configurations are available, // ranging from configuring to support annotation scanning in the // webapp (through PlusConfiguration) to choosing where the webapp // will unpack itself. WebAppContext webapp = new WebAppContext(); webapp.setContextPath("/"); webapp.setWar("path/to/my/test.war"); // A WebAppContext is a ContextHandler as well so it needs to be set to // the server so it is aware of where to send the appropriate requests. server.setHandler(webapp); // Start things up! By using the server.join() the server thread will // join with the current thread. // See http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#join() // for more details. server.start(); server.join(); } } 

请注意,您将构建一个普通的WAR文件,并将其与Jetty一起使用。

如果您有特殊要求,例如Annotation扫描或JNDI,那么您需要进入配置规范。

 // Enable parsing of jndi-related parts of web.xml and jetty-env.xml org.eclipse.jetty.webapp.Configuration.ClassList classlist = org.eclipse.jetty.webapp.Configuration.ClassList.setServerDefault(server); // Enable JNDI classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration", "org.eclipse.jetty.plus.webapp.EnvConfiguration", "org.eclipse.jetty.plus.webapp.PlusConfiguration"); // Enable Annotation Scanning classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", "org.eclipse.jetty.annotations.AnnotationConfiguration"); 

有关WebAppContext中较长的示例,请参阅ServerWithAnnotations示例。

另请注意,您将使用此技术制定所有webapp类加载器规则。 这意味着您将拥有webapp的类加载器和服务器的另一个类加载器。 这一点很重要。

您可以对类加载器的WebAppContext进行一些调整,但是您无法消除它们,只是控制它们的行为方式。

 WebAppContext webapp = new WebAppContext(); // ... various setup of the webapp ... // Flip the classloader priority from servlet spec where webapp is first to // Standard java behavior of parent (aka Server classloader) is first. webapp.setParentLoaderPriority(true); 

也可以看看:

  • WebAppContext.setClassLoader(ClassLoader classloader)
  • WebAppContext.addServerClass(String classOrPackage)
  • WebAppContext.addSystemClass(String classOrPackage)

我最终使用了Joakim的方法,但指向webapp目录而不是war文件。

 public static void main(String[] args) throws Exception { Server server = new Server(8080); String rootPath = SimplestServer.class.getClassLoader().getResource(".").toString(); WebAppContext webapp = new WebAppContext(rootPath + "../../src/main/webapp", ""); server.setHandler(webapp); server.start(); server.join(); }