Сбой CDI OpenWebBeans в Java 11

Мое приложение использует 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)

Пожалуйста, предложите, как решить эту проблему. Я обновил CDI opewebbeans для Tomcat до последней версии, а также обновил JaxB-api, но, похоже, ничего не работает. Есть ли кто-нибудь, кто использует Tomcat 9 с Java 11?


person Aditya Batra    schedule 17.12.2018    source источник
comment
Первое предложение - добавить больше содержимого файла журнала. Полные трассировки стека исключений довольно выразительны.   -  person Selaron    schedule 17.12.2018
comment
Это работало в java 10?   -  person Kukeltje    schedule 17.12.2018
comment
@Kukeltje Это работало в Java 8, мы перешли с 8 на Java 11.   -  person Aditya Batra    schedule 18.12.2018
comment
Пожалуйста, ответьте и на другой комментарий   -  person Kukeltje    schedule 18.12.2018
comment
@AdityaBatra выглядит так, как будто вы изначально обнаружили правильное исключение основной причины в журнале Tomcat. Не все так делают, +1 за это и предоставление базовой информации о версии.   -  person Selaron    schedule 19.12.2018


Ответы (1)


TL;DR: вы обновили OWB с 1.6 до 2.0, но не смогли обновить их зависимости.

OpenWebBeans 2.0.8 зависит от xbean-asm7-shaded-4.12, который реализует класс org.apache.xbean.asm7.ClassReader. Каким-то образом ваш OWB использует более старый класс org.apache.xbean.asm5.ClassReader для обнаружения классов аннотированных компонентов CDI. Но разработчики в 2015 году не смогли предсказать, как читать Java 11. занятия в 2018 году (скнр).

Немного протестировав, я обнаружил, что у вас также должен быть старый xbean-finder-shaded-4.3 в вашем пути к классам, который зависит от этого старого org.apache.xbean.asm5.ClassReader из xbean-asm5-shaded и использует его.

В заключение я бы посоветовал вам избавиться от этих конфликтов зависимостей, на которые указывает ваша трассировка стека исключений. Кроме того, вы можете использовать инструмент сборки, такой как maven. Это очень помогает пройти через ад зависимостей, в основном, не обжигаясь.

Изменить:

Относительно вашего комментария см. эти вопросы:

В зависимости от вашей среды вам также может потребоваться добавить замены для модулей, которые устарели в Java 9 и удалены в Java 11:

Редактировать 2:

Вы можете @Inject DocumentBuilderFactory экземпляров, используя метод производителя, аннотированный @Produces, как описано в мом ответе на ваш дополнительный вопрос.

person Selaron    schedule 19.12.2018
comment
Спасибо @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 - person Aditya Batra; 19.12.2018
comment
@AdityaBatra вы сталкиваетесь с одной проблемой зависимостей за другой, вызванной серьезным обновлением среды (jdk 11, OWB, ...). В случае отсутствия классов хорошей отправной точкой будет использование условий поиска, таких как java.lang.NoClassDefFoundError: Could not initialize class org.glassfish.jersey.internal.inject.Providers и т. д. Тем не менее, я добавил в свой ответ несколько дополнительных советов. - person Selaron; 19.12.2018
comment
Спасибо. Сначала я обратил внимание на эти ошибки NoClassDefFoundError, однако основная проблема остается прежней и связана с CDI в моем приложении. Журналы ошибок прилагаются: pastebin.com/7jCwJzb2 PS: Ваши ссылки помогли мне устранить оставшиеся ошибки NoClassDefFoundError. - person Aditya Batra; 20.12.2018
comment
У вас есть поле с именем logMessages типа com.xyz.abc.tools.log.LogMessages в каком-то классе, которое не соответствует @Inject. В других классах у вас есть поля с именем documentBuilderFactory типа javax.xml.parsers.DocumentBuilderFactory, которые также не соответствуют @Inject. - person Selaron; 20.12.2018
comment
Верно, так написано в журнале. Есть ли у вас какие-либо идеи о том, почему это создает проблему с java 11, поскольку она отлично работала на Java 8. Мой класс logMessages выглядит как открытый класс @ApplicationScoped LogMessages { // code } - person Aditya Batra; 21.12.2018
comment
Мне нужен минимальный воспроизводимый пример или небольшой проект воспроизведения, так как я не могу воспроизвести эти исключения с помощью Tomcat 9, jdk 11 и OWB 2.0.8 - person Selaron; 21.12.2018
comment
Привет @Selaron, не могли бы вы обратиться к stackoverflow.com/questions/54019932/ для лучшей идеи. Похоже, что это не проблема с CDI API, а доступ к CDI, который стал незаконным в Java 11. Объект DocumentBuilderFactory больше не может быть внедрен во время выполнения. - person Aditya Batra; 07.01.2019
comment
@AdityaBatra откуда вы знаете, что теперь это незаконно в новом CDI или Java? Возможно ли, что у вас есть несколько классов реализации abstract DocumentBuilderFactory в вашем пути к классам, и инфраструктура CDI теперь не знает, какой из них внедрить? - person Selaron; 07.01.2019
comment
Да, это может быть так, поскольку экземпляр DocumentBuilderFactoryImpl доступен как в пакетах org.apache..jaxp, так и в пакетах com.sun.org.apache.xerces.internal.jaxp. Но это было верно и для Java 8, где все работало нормально. Разница в Java 11 заключается в том, что метод newInstance() возвращает экземпляр последнего типа, а время выполнения возвращает первый. Можем ли мы исключить реализацию в JDK, чтобы она выбрала старую? - person Aditya Batra; 08.01.2019
comment
@AdityaBatra В мой ответ добавлена ​​подсказка относительно инъекции DocumentBuilderFactory. - person Selaron; 08.01.2019
comment
Спасибо за помощь. В моих классах поставщиков инъекций отсутствовала аннотация ApplicationScoped, которая отлично работала в Java 8, но вызывала проблемы в Java 11. - person Aditya Batra; 08.01.2019
comment
да, это была проблема, связанная с stackoverflow.com/questions/54019932/ и была решена. Спасибо. - person Aditya Batra; 10.01.2019
comment
Спрашиваю, потому что вы еще не отметили его ответом ;-D - person Selaron; 10.01.2019