我试图用我的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部分中包含以下内容:
<servlet>
<servlet-class>com.example.HelloServlet</servlet-class>
<servlet-name>SimplestServer</servlet-name>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
这有效 . 但是,我想摆脱两种方法之间的重复 . 即,当我添加一个新的servlet时,我想要只在一个位置配置它 . 我可以从嵌入式jetty加载和使用web.xml文件吗?
2 回答
使用org.eclipse.jetty.webapp.WebAppContext
例:
请注意,您将构建一个普通的WAR文件,并将其与Jetty一起使用 .
如果您有特殊要求,例如Annotation扫描或JNDI,那么您需要进入配置规范 .
有关WebAppContext中较长的示例,请参阅ServerWithAnnotations示例 .
另请注意,您将使用此技术制定所有webapp类加载器规则 . 这意味着您将拥有webapp的类加载器和服务器的另一个类加载器 . 这一点很重要 .
您可以对WebAppContext进行类加载器的一些调整,但是您无法消除它们,只是控制它们的行为方式 .
也可以看看:
WebAppContext.setClassLoader(ClassLoader classloader)
WebAppContext.addServerClass(String classOrPackage)
WebAppContext.addSystemClass(String classOrPackage)
我最终使用了Joakim的方法,但指向webapp目录而不是war文件 .