我們最近遷移到Servlet API 3.0。由於我們正在開發一個框架,有時需要對web.xml
進行一些更改,所以基於框架的項目需要在框架更改時更新其web.xml
。在巨大的項目環境中使用Web碎片(Servlet API 3.0)
Servlet API 3.0引入了新的Web碎片,這使得這種行爲更鬆散耦合和動態。我創建了一個web-fragment.xml
並將所有東西從web.xml中移出。所以這些項目現在只需要定義以下web.xml
和他們自己的附加聲明。
<?xml version="1.0" encoding="UTF-8"?>
<web-app
version="3.0"
metadata-complete="false"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
</web-app>
我們必須使用metadata-complete="false"
使JAR中的片段搜索(我們的框架在META-INF/
的web-fragment.xml
。
由於我們有許多依賴於其他框架和庫(約80-90)和metadata-complete="false"
也觸發搜索註釋它佔用不可接受12秒通過所有的庫進行搜索。
,因爲它的偉大工程,我喜歡這樣的事實,我們更decou機制來自我們的框架,但啓動時間是致命的!此外,我們必須將可用內存從-Xms256m -Xmx512m
增加到-Xms512m -Xmx1024m
,以使其啓動而不會得到java.lang.OutOfMemoryError: Java heap space
(由Tomcat的低效實施的註釋處理器(緩存大約50.000個類)引起)。
我知道,我們可以禁用庫中的註釋檢索,但我們大多使用第三方不具備metadata-complete="true"
標誌,這也是不是一個選項。
我們可以做任何事情來禁用搜索註釋嗎?或者我們可以強制Servlet容器只在聲明的庫中搜索web-fragment.xml
?
我真的很想使用新的網頁片段功能,但隨着啓動時間和內存的增加,這是不可能的。
這確實是一個解決方案,謝謝!不幸的是,這將是一個servlet容器相關的解決方案。我們的目標是在每個servlet容器上運行,所以這個解決方案對我們來說不是一個好選擇。 – codevour 2012-03-09 10:04:33
@codevour您在此期間如何解決您的問題? – phant0m 2017-07-11 07:26:26