java - 在庞大的项目环境中使用网页片段(Servlet API 3.0)

标签 java tomcat servlet-3.0

我们最近迁移到了 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/

相关文章:

java - Jackson Spring Controller 序列化

java - 重试模式与休息客户端中的回退模式

java - 如何在 Tomcat 上将 JSESSIONID 域设置为二级域?

jsf - SAXException 启动 Tomhawk2-1.1.10

java - Servlet 3.0 AsyncContext 在超时时返回响应

java - Servlet 安全注释错误

tomcat - 在 servlet 应用程序中保存上传文件的推荐方法

java - 我可以使用什么方法通过 Java 配置/更新弹性负载均衡器?

java - 编译时的工厂模式

apache - 使用 Tomcat 应用程序保护 HttpServer 上的内容——有什么想法吗?