2016-02-29 82 views
0

我的应用程序在嵌入式Jetty 9.2.11上运行良好,但是在与maven assembly插件组装之后,只有在web.xml中声明的Servlet才能提供服务。嵌入式jetty未能发现maven程序集中的web-fragment.xml

我的罐包含WEB-INF/web.xml使用的Servlet 3.0格式 一些罐子放置在WEB-INF/lib,每个META-INF/web-fragment.xml。从NetBeans运行时,这些可以很好地发现。

QueuedThreadPool pool = new QueuedThreadPool(20); 
Server server = new Server(pool); 
server.setStopAtShutdown(true); 
ServerConnector connector = new ServerConnector(server); 
connector.setPort(8888); 
server.addConnector(connector); 
pool.start(); 
connector.start(); 

WebAppContext webapp = new WebAppContext(); 
webapp.setContextPath("/"); 
webapp.setDescriptor("WEB-INF/web.xml"); 
webapp.setDefaultsDescriptor("webdefault.xml"); 
webapp.setClassLoader(MyURIClassLoader); 
webapp.setExtractWAR(false); 
webapp.setCopyWebDir(false); 
webapp.setConfigurationDiscovered(true); 

List<String> configs = new ArrayList<>(5); 
configs.add("org.eclipse.jetty.webapp.WebInfConfiguration"); 
configs.add("org.eclipse.jetty.webapp.WebXmlConfiguration"); 
configs.add("org.eclipse.jetty.webapp.MetaInfConfiguration"); 
configs.add("org.eclipse.jetty.webapp.FragmentConfiguration"); 
configs.add("org.eclipse.jetty.webapp.JettyWebXmlConfiguration"); 
webapp.setConfigurationClasses(configs); 

ContextHandlerCollection container = new ContextHandlerCollection(); 
container.setHandlers(handlers.toArray(new Handler[handlers.size()])); 
server.setHandler(new HTTPGlobalHandler(container)); 
server.start(); 

所有web.xmlweb-fragment.xml文件是非常标准。只有servlet和安全设置,包括CORS。

组装的结构如下:

​​
+0

在这种情况下,什么是WebAppContext基础资源? –

+0

Joakim Erdfelt我将WEB-INF/web.xml所在的URL设置为基础资源(对不起,这里省略)。我使用URLClassLoader来查找此文件的URL并删除结尾部分,结果以斜杠结尾。 –

回答

0

有Servlet的3兼容的servlet容器(码头9),你可以不用用户web.xml在所有和只有配置的Java应用程序中。这是一个good starting point如何做到这一点。

+0

谢谢。我意识到这一点。然而,这个项目的历史可以追溯到3.0天以前的版本和旧版本的Jetty,所以我有很多需要重新访问的代码。另一点是,我还没有找到一种方法来在注释中声明CORS设置。 我可以试试它,但它会帮助吗?如果Web碎片没有被扫描,为什么注释会有所不同? –