【问题标题】:OpenWebBeans CDI failing in Java 11Java 11 中的 OpenWebBeans CDI 失败
【发布时间】:2019-05-17 19:14:55
【问题描述】:

我的应用程序使用 Java 11、Tomcat 9.0.13 和 OpenWeBeans CDI 2.0.8。在启动我的 Tomcat 服务器时,我收到以下错误:

Dec 19, 2018 9:59:04 AM org.apache.webbeans.servlet.WebBeansConfigurationListener contextInitialized
SEVERE: An error occurred while starting application context path : [/abcServer]
Dec 19, 2018 9:59:04 AM org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class org.apache.webbeans.servlet.WebBeansConfigurationListener
org.apache.webbeans.exception.WebBeansDeploymentException: java.lang.IllegalArgumentException
    at org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery.scan(AbstractMetaDataDiscovery.java:144)
    at org.apache.webbeans.lifecycle.AbstractLifeCycle.bootstrapApplication(AbstractLifeCycle.java:132)
    at org.apache.webbeans.lifecycle.AbstractLifeCycle.startApplication(AbstractLifeCycle.java:104)
    at org.apache.webbeans.web.lifecycle.WebContainerLifecycle.startApplication(WebContainerLifecycle.java:87)
    at org.apache.webbeans.servlet.WebBeansConfigurationListener.contextInitialized(WebBeansConfigurationListener.java:85)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5110)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5633)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1694)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1684)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.IllegalArgumentException
    at org.apache.xbean.asm5.ClassReader.<init>(Unknown Source)
    at org.apache.xbean.asm5.ClassReader.<init>(Unknown Source)
    at org.apache.xbean.asm5.ClassReader.<init>(Unknown Source)
    at org.apache.xbean.finder.AnnotationFinder.readClassDef(AnnotationFinder.java:1169)
    at org.apache.xbean.finder.AnnotationFinder.<init>(AnnotationFinder.java:147)
    at org.apache.xbean.finder.AnnotationFinder.<init>(AnnotationFinder.java:160)
    at org.apache.webbeans.corespi.scanner.xbean.OwbAnnotationFinder.<init>(OwbAnnotationFinder.java:37)
    at org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery.initFinder(AbstractMetaDataDiscovery.java:107)
    at org.apache.webbeans.corespi.scanner.AbstractMetaDataDiscovery.scan(AbstractMetaDataDiscovery.java:140)
    ... 13 more

Dec 19, 2018 9:59:04 AM org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class com.xyz.abc.application.impl.ApplicationControllerAdapter
javax.enterprise.inject.UnsatisfiedResolutionException: Api type [com.xyz.abc.cleanup.CleanupJobController] is not found with the qualifiers 
Qualifiers: [@javax.enterprise.inject.Default()]
for injection into Field Injection Point, field name :  cleanupJobController, Bean Owner : [null]
    at org.apache.webbeans.util.InjectionExceptionUtil.throwUnsatisfiedResolutionException(InjectionExceptionUtil.java:65)
    at org.apache.webbeans.container.InjectionResolver.getInjectionPointBean(InjectionResolver.java:271)
    at org.apache.webbeans.inject.AbstractInjectable.inject(AbstractInjectable.java:82)
    at org.apache.webbeans.inject.InjectableField.doInjection(InjectableField.java:65)
    at org.apache.webbeans.portable.InjectionTargetImpl.injectFields(InjectionTargetImpl.java:220)
    at org.apache.webbeans.portable.InjectionTargetImpl.inject(InjectionTargetImpl.java:206)
    at org.apache.webbeans.portable.InjectionTargetImpl.inject(InjectionTargetImpl.java:196)
    at com.xyz.abc.inject.CDIUtils.injectFields(CDIUtils.java:37)
    at com.xyz.abc.application.impl.ApplicationStarted.<init>(ApplicationStarted.java:149)
    at com.xyz.abc.application.impl.ApplicationControllerAdapter.contextInitialized(ApplicationControllerAdapter.java:34)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5110)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5633)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1694)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1684)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)

Dec 19, 2018 9:59:04 AM com.sun.xml.ws.transport.http.servlet.WSServletContextListener contextInitialized
INFO: WSSERVLET12: JAX-WS context listener initializing
Dec 19, 2018 9:59:04 AM org.apache.catalina.core.StandardContext startInternal
SEVERE: One or more listeners failed to start. Full details will be found in the appropriate container log file
Dec 19, 2018 9:59:04 AM org.apache.catalina.core.StandardContext startInternal
SEVERE: Context [/abcServer] startup failed due to previous errors
Dec 19, 2018 9:59:04 AM com.sun.xml.ws.transport.http.servlet.WSServletDelegate destroy
INFO: WSSERVLET15: JAX-WS servlet destroyed
Dec 19, 2018 9:59:04 AM com.sun.xml.ws.transport.http.servlet.WSServletContextListener contextDestroyed
INFO: WSSERVLET13: JAX-WS context listener destroyed
Dec 19, 2018 9:59:04 AM org.apache.catalina.core.StandardContext listenerStop
SEVERE: Exception sending context destroyed event to listener instance of class com.xyz.abc.application.impl.ApplicationControllerAdapter
javax.enterprise.inject.UnsatisfiedResolutionException: Api type [com.xyz.abc.licensing.License] is not found with the qualifiers 
Qualifiers: [@javax.enterprise.inject.Default()]
for injection into Field Injection Point, field name :  license, Bean Owner : [null]
    at org.apache.webbeans.util.InjectionExceptionUtil.throwUnsatisfiedResolutionException(InjectionExceptionUtil.java:65)
    at org.apache.webbeans.container.InjectionResolver.getInjectionPointBean(InjectionResolver.java:271)
    at org.apache.webbeans.inject.AbstractInjectable.inject(AbstractInjectable.java:82)
    at org.apache.webbeans.inject.InjectableField.doInjection(InjectableField.java:65)
    at org.apache.webbeans.portable.InjectionTargetImpl.injectFields(InjectionTargetImpl.java:220)
    at org.apache.webbeans.portable.InjectionTargetImpl.inject(InjectionTargetImpl.java:206)
    at org.apache.webbeans.portable.InjectionTargetImpl.inject(InjectionTargetImpl.java:196)
    at com.xyz.abc.inject.CDIUtils.injectFields(CDIUtils.java:37)
    at com.xyz.abc.application.impl.ApplicationStopped.<init>(ApplicationStopped.java:85)
    at com.xyz.abc.application.impl.ApplicationControllerAdapter.contextDestroyed(ApplicationControllerAdapter.java:27)
    at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:5157)
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5830)
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:221)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:149)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1694)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1684)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)

请建议如何解决此问题。我已将 Tomcat 的 opewebbeans CDI 更新到最新版本,也更新了 JaxB-api,但似乎没有任何效果。是否有人将 Tomcat 9 与 Java 11 一起使用?

【问题讨论】:

  • 第一个建议是添加更多日志文件内容。完整的异常堆栈跟踪非常有表现力。
  • 它在 java 10 中是否有效?
  • @Kukeltje 它在 Java 8 中工作,我们从 8 迁移到 Java 11。
  • 其他评论也请回复
  • @AdityaBatra 看起来您最初在 Tomcat 日志中发现了正确的根本原因异常。不是每个人都这样做,为此 +1 并提供基本版本信息。

标签: java tomcat cdi java-11


【解决方案1】:

TL;DR:您将 OWB 从 1.6 更新到 2.0,但未能更新他们的 dependencies

OpenWebBeans 2.0.8 依赖于实现类org.apache.xbean.asm7.ClassReaderxbean-asm7-shaded-4.12。 不知何故,您的 OWB 使用较旧的类 org.apache.xbean.asm5.ClassReader 来发现 CDI 注释的 bean 类。但是开发者in 2015没能预测到2018年如何读取Java 11类(scnr)。

测试了一下,我发现你的类路径中还必须有一个旧的xbean-finder-shaded-4.3,它依赖并使用来自xbean-asm5-shaded 的旧org.apache.xbean.asm5.ClassReader

作为结论,我建议您摆脱异常堆栈跟踪指出的那些依赖冲突。此外,您可能想要使用像 maven 这样的构建工具。这在很大程度上帮助您度过了依赖地狱,而不会被烧毁。

编辑:

关于您的评论,请参阅以下问题:

根据您的环境,您可能还需要为 Java 9 中已弃用并在 Java 11 中删除的模块添加替换:

编辑 2:

您可以使用@Produces 注释的生产者方法@Inject DocumentBuilderFactory 实例,如my answer to your followup question 中所述。

【讨论】:

  • 感谢@selaron,我相信它确实起到了一些作用,因为错误已经发生了变化。请在附件中找到新错误的完整日志:pastebin.com/8UDe9fxp E - 启动应用程序上下文路径时发生错误:[/abcServer ] 16:43:19,110 E - 将上下文初始化事件发送到类 [org.apache.webbeans.servlet.WebBeansConfigurationListener] org.apache.webbeans.exception.WebBeansConfigurationException 的侦听器实例的异常:将 SystemEvent 发送到 CDI 扩展时出错! org.apache.webbeans.portable.events.generics.GProcessInjectionTarget
  • @AdityaBatra 您遇到了一个又一个的依赖问题,这是由于您的大量环境升级(jdk 11,OWB,...)引起的。如果缺少课程,使用 java.lang.NoClassDefFoundError: Could not initialize class org.glassfish.jersey.internal.inject.Providers 等搜索词是一个很好的起点。不过,我在答案中添加了一些进一步的提示。
  • 谢谢。我首先关注了这些 NoClassDefFoundError,但主要问题仍然相同,这与我的应用程序中的 CDI 有关。请在附件中找到错误日志:pastebin.com/7jCwJzb2 PS:您的链接帮助我解决了剩余的 NoClassDefFoundError 错误。
  • 您有一个名为 logMessages 的字段,类型为 com.xyz.abc.tools.log.LogMessages,在某个类中无法使用 @Inject。在其他类中,您有名为 documentBuilderFactory 类型为 javax.xml.parsers.DocumentBuilderFactory 的字段也不能为 @Inject
  • 对,这就是日志所说的。您是否知道为什么这会在 Java 11 上产生问题,因为它在 Java 8 上运行良好。我的 logMessages 类看起来像 @ApplicationScoped public class LogMessages { //code }
猜你喜欢
  • 2014-03-28
  • 2011-12-23
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
相关资源
最近更新 更多