【问题标题】:Disable scanning of CDI beans in WAR在 WAR 中禁用 CDI bean 扫描
【发布时间】:2015-06-16 09:37:09
【问题描述】:

我有带有 CDI bean 的 WAR 包。包的部署非常缓慢,因为每次在部署过程中都会扫描包以查找 CDI bean。是否有任何选项可以禁用此过程?

【问题讨论】:

  • 您使用的是哪种 CDI 实现?哪个应用服务器?
  • 您只想为一个存档禁用 CDI 还是完全禁用?
  • 我使用 Tomcat 8 和 org.jboss.weld.servlet 2.2.12.Final
  • 我认为你有一些倒退的地方,或者至少有一些读者不清楚的地方。您正在打包 tomcat + Weld servlet,但您想禁用 CDI 扫描?您还想如何注册您的 bean?

标签: deployment cdi war managed-bean scanning


【解决方案1】:

正确的做法是在相关存档的 beans.xml 中禁用发现:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                        http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
    version="1.1" bean-discovery-mode="none">
</beans>

根据CDI specification,这会将存档从 bean-archives 列表中删除。

【讨论】:

  • 我得到 java.lang.IllegalStateException: Singleton not set for STATIC_INSTANCE => []
  • 您确定可以为您的存档禁用 CDI 吗?
  • 我想通过禁用 CDI 框架对包的扫描来加速包部署,而不是在运行时禁用使用。
  • 在不扫描档案的情况下,CDI 应该如何知道存在哪些托管 Bean?您可以通过将软件拆分为多个 jar 并仅在其中一些中放置 beans.xml 来加快部署速度。但这完全是另一个问题。
【解决方案2】:

我感觉您正在寻找的更多是一种工具。如前所述,Weld 使用类扫描来查找注释。有一些方法可以加快速度。一个很好用的是Jandex,它是一个注释处理器,可以在编译时用来为你的类和注释创建一个索引(更容易阅读数据库)。这确实大大缩短了部署时间。

【讨论】:

  • 有趣的建议。但似乎 Weld 2.2 已经使用了 Jandex (link)。
  • 是的,weld 2.2 使用 Jandex。但是,为了让您的应用使用 Jandex,您需要在编译时启用该插件。
  • 啊,好的。我得找个时间试试看。
  • 嗨,John,是否还有更多工作要做才能使 Jandex 能够使用。我刚刚尝试使用和不使用 Jandex 部署一个相当大的应用程序。带有 jandex 的 WAR 文件大约为 2MB 或更大,总战争大小为 79 MB,而没有任何 jandex 信息的战争为 77 MB。部署时间完全不受影响。如果在我做的最后一次测试中,带有 jandex 的 WAR 似乎要多花 2 秒。很明显,我觉得将索引放在 WEB-INF/lib/jar 文件中并没有相关的好处。我不确定我是否做错了什么......但没有改进。
  • JAR 文件包含带有 discover-mode=all 的 beans.xml 的事实是否起作用? htis 是否以某种方式指示 WELD 不使用 jandex 而只是进行正常扫描?对我来说这毫无意义......应该感觉到某种程度的改进。
猜你喜欢
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 2022-01-18
  • 2013-07-08
  • 1970-01-01
  • 2015-12-26
相关资源
最近更新 更多