在庞大的项目环境中使用Web片段(Servlet API 3.0)

Chr*_*wes 7 java tomcat servlet-3.0

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

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>
Run Code Online (Sandbox Code Playgroud)

我们必须使用metadata-complete="false"在JAR中启用Fragment搜索(我们的框架具有web-fragment.xmlin META-INF/.

由于我们对其他框架和库(大约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

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

hom*_*ome 3

您可以通过配置禁用某些 JAR 文件的注释处理。我仅将其用于 JAR 文件,它可能不适用于已分解的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
Run Code Online (Sandbox Code Playgroud)