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.xml
in 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
?
我真的想使用新的网络片段功能,但随着启动时间和内存的增加,这是不可能的.
您可以通过配置禁用某些 JAR 文件的注释处理。我仅将其用于 JAR 文件,它可能不适用于已分解的WAR
s。看<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)
归档时间: |
|
查看次数: |
8603 次 |
最近记录: |