7

我们最近迁移到 Servlet API 3.0。由于我们正在开发一个有时需要web.xmlweb.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 中的片段搜索(我们的框架有web-fragment.xmlin META-INF/.

由于我们对其他框架和库有许多依赖项(大约 80-90 个),并且metadata-complete="false"还触发了搜索注释,因此搜索所有库需要长达12 秒的时间,这是不可接受的。

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


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

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

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

4

2 回答 2

3

您可以通过配置对某些 JAR 文件禁用注释处理。我只将它用于 JAR 文件,它可能不适用于 exploded WARs。看<tomcat>/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
于 2012-03-05T16:30:45.203 回答
0

从 7.0.30 开始,Tomcat 中有一些系统属性可以控制 JAR 扫描。在此处查看文档页面。

基本上这些是:

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

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

于 2014-03-04T12:11:30.667 回答