我们最近迁移到 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 中的片段搜索(我们的框架有web-fragment.xml
in 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 片段功能,但是随着启动时间和内存的增加,这是不可能的。