【问题标题】:Make use of web fragments (Servlet API 3.0) in a huge project environment在庞大的项目环境中使用 Web 片段(Servlet API 3.0)
【发布时间】:2012-03-05 10:13:29
【问题描述】:

我们最近迁移到了 Servlet API 3.0。由于我们正在开发的框架有时需要对 web.xml 进行一些更改,因此基于我们的框架的项目需要在框架发生更改时更新其 web.xml

Servlet API 3.0 引入了新的Web Fragments,这使得这种行为更加松散耦合和动态。我创建了一个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 秒

该机制运行良好,我喜欢我们与框架更加分离的事实,但启动时间是致命的!此外,我们必须将 Tomcat 的可用内存从 -Xms256m -Xmx512m 增加到 -Xms512m -Xmx1024m 以在不获取 java.lang.OutOfMemoryError: Java heap space 的情况下启动它(由于 Tomcat 的注释处理器实现效率低下(缓存了大约 50.000 个类))。


我知道我们可以禁用库中的注释搜索,但由于我们主要使用没有 metadata-complete="true" 标志的第三方,这也不是一个选项。

我们可以做些什么来禁用对注释的搜索吗?或者我们可以强制 Servlet 容器只在声明的库中搜索 web-fragment.xml

我真的很想使用新的 Web 片段功能,但随着启动时间和内存的增加,这是不可能的。

【问题讨论】:

    标签: java tomcat servlet-3.0


    【解决方案1】:

    您可以通过配置对某些 JAR 文件禁用注释处理。我只将它用于 JAR 文件,它可能不适用于爆炸的WARs。看&lt;tomcat&gt;/conf/catalina.properties,第76行(Tomcat 7.0.22):

    # 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
    

    【讨论】:

    • 这确实是一个解决方案,谢谢!不幸的是,这将是一个依赖于 servlet 容器的解决方案。我们的目标是在每个 servlet 容器上运行,所以这个解决方案对我们来说不是一个好的选择。
    • @codevour 在此期间您是如何解决问题的?
    【解决方案2】:

    自 7.0.30 起,Tomcat 中有一些系统属性可以控制 JAR 扫描。检查文档页面here

    基本上这些是:

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

    不确定您可以设置它们的最早时间是什么时候,可能是ContextListener

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 2016-09-17
      相关资源
      最近更新 更多