我们最近迁移到了 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 中有
.web-fragment.xml
-INF/
由于我们对其他框架和库有很多依赖项(大约 80-90),而且 metadata-complete="false"
还会触发搜索注释,这需要花费 Not Acceptable 12 秒 搜索所有库。
该机制运行良好,我喜欢我们与框架更加解耦的事实,但启动时间是致命的!此外,我们还必须将 Tomcat 的可用内存从 -Xms256m -Xmx512m
增加到 -Xms512m -Xmx1024m
以启动它而不会出现 java.lang.OutOfMemoryError: Java 堆空间
(由 Tomcat 的注解处理器实现效率低下引起(大约缓存了 50.000 个类))。
我知道我们可以在库中禁用注释搜索,但由于我们主要使用没有 metadata-complete="true"
标志的第三方,这也不是一个选择。
我们可以做些什么来禁用注释搜索吗?或者我们可以强制 Servlet 容器只在声明的库中搜索 web-fragment.xml
吗?
我真的很想使用新的网页片段功能,但随着启动时间和内存的增加,这是不可能的。
最佳答案
您可以通过配置某些 JAR 文件来禁用注释处理。我只将它用于 JAR 文件,它可能不适用于展开的 WAR
秒。看<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
关于java - 在庞大的项目环境中使用网页片段(Servlet API 3.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9564900/