2012-03-05 19 views
6

我們最近遷移到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

我真的很想使用新的網頁片段功能,但隨着啓動時間和內存的增加,這是不可能的。

回答

3

您可以通過對某些JAR文件進行配置來禁用註釋處理。我僅將它用於JAR文件,它可能不適用於爆炸WAR s。看<tomcat>/conf/catalina.properties,線76(7.0.22 Tomcat的):

# List of JAR files that should not be scanned for configuration information 
# such as web fragments, TLD files etc. It must be a comma separated list of 
# JAR file names. 
# The JARs listed below include: 
# - Tomcat Bootstrap JARs 
# - Tomcat API JARs 
# - Catalina JARs 
# - Jasper JARs 
# - Tomcat JARs 
# - Common non-Tomcat JARs 
# - Sun JDK JARs 
# - Apple JDK JARs 
+0

這確實是一個解決方案,謝謝!不幸的是,這將是一個servlet容器相關的解決方案。我們的目標是在每個servlet容器上運行,所以這個解決方案對我們來說不是一個好選擇。 – codevour 2012-03-09 10:04:33

+0

@codevour您在此期間如何解決您的問題? – phant0m 2017-07-11 07:26:26

0

有在Tomcat的一些系統屬性,使自7.0.30控制JAR掃描。檢查文檔頁面here

基本上這些的是:

  • tomcat.util.scan.DefaultJarScanner.jarsToSkip
  • org.apache.catalina.startup.ContextConfig.jarsToSkip
  • org.apache.catalina.startup.TldConfig.jarsToSkip

不知道什麼是你可以通過設置他們,也許ContextListener最早的時候?

相關問題