2016-02-29 86 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碎片沒有被掃描,爲什麼註釋會有所不同? –