#java #jax-rs #undertow #jboss-weld #undertowjaxrsserver
Вопрос:
У меня есть интеграционный тест JAX-RS, который работает локально, как в IntelliJ (используя Gradle для запуска теста), так и в командной строке Gradle .
Но когда я запускаю тест в Дженкинсе, тест завершается неудачей из-за какой-то проблемы во время развертывания Undertow.
Вот как я запускаю контейнер :
public static void startContainer() throws ServletException {
System.setProperty("org.jboss.resteasy.port", "8085");
server = new UndertowJaxrsServer().start();
ResteasyDeployment deployment = new ResteasyDeployment();
deployment.setInjectorFactoryClass("org.jboss.resteasy.cdi.CdiInjectorFactory");
deployment.setApplicationClass(MyApp.class.getName());
DeploymentInfo di = server.undertowDeployment(deployment);
di.setClassLoader(Server.class.getClassLoader());
di.setResourceManager(new ClassPathResourceManager(Server.class.getClassLoader()));
di.setContextPath("/vincent-service");
di.setDeploymentName("DI");
di.addListeners(Servlets.listener(org.jboss.weld.environment.servlet.Listener.class));
server.deploy(di);
}
Когда тест выполняется в Дженкинсе, я получаю исключение NullPointerException :
исключение java.lang.RuntimeException: java.lang.Исключение NullPointerException в io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:254) в org.jboss.resteasy.plugins.server.undertow.UndertowJaxrsServer.deploy(UndertowJaxrsServer.java:266)
…
Вызвано: java.lang.Исключение NullPointerException в org.jboss.weld.module.web.servlet.WeldInitialListener.контекстинициализирован(WeldInitialListener.java:94) в org.jboss.weld.сервлет.api.помощники.Перенаправление servletlistener.контекстинициализировано(перенаправление servletlistener.java:34) в org.jboss.weld.environment.сервлет.Слушатель.контекстинициализирован(Слушатель.java:121) в io.undertow.servlet.core.ApplicationListeners.контекстинициализирован(ApplicationListeners.java:187) в io.undertow.servlet.core.DeploymentManagerImpl$1.вызов(DeploymentManagerImpl.java:217) при вводе-выводе.подводное течение.сервлет.ядро.DeploymentManagerImpl$1.вызов(DeploymentManagerImpl.java:186) в io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.вызов(ServletRequestContextThreadSetupAction.java:42) в io.undertow.servlet.core.ContextClassLoaderSetupAction$1.вызов(ContextClassLoaderSetupAction.java:43) в io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:252)
Looking in Weld source code (in weld-web-3.1.2.Final), it seems the exception is thrown from the last line here :
@Override
public void contextInitialized(ServletContextEvent sce) {
final ServletContext ctx = sce.getServletContext();
// First try to use the context id obtained from the servlet context (OSGi, Servlet containers, etc.)
if (beanManager == null) {
String contextId = ctx.getInitParameter(Container.CONTEXT_ID_KEY);
if (contextId != null) {
List<BeanManagerImpl> managers = new ArrayList<BeanManagerImpl>(Container.instance(contextId).beanDeploymentArchives().values());
Collections.sort(managers, BeanManagers.ID_COMPARATOR);
beanManager = managers.get(0);
}
}
// servlet containers may not be able to inject fields in a servlet listener
if (beanManager == null) {
beanManager = BeanManagerProxy.unwrap(CDI.current().getBeanManager());
}
Part of the test is running though, as I can see these logs :
[2021-10-06T08:44:16.016Z] [io.undertow.Undertow] [Test worker] [117]
[INFO ] starting server: Undertow — 2.1.3.Final[2021-10-06T08:44:16.016Z] [org.xnio.Xnio] [Test worker] [95] [INFO ]
XNIO version 3.8.0.Final[2021-10-06T08:44:16.016Z] [org.xnio.nio.NioXnio] [Test worker] [59]
[INFO ] XNIO NIO Implementation Version 3.8.0.Final[2021-10-06T08:44:16.016Z] [org.jboss.threads.Version] [Test worker]
[52] [INFO ] JBoss Threads version 3.1.0.Final[2021-10-06T08:44:17.017Z]
[org.jboss.weld.environment.servlet.Listener] [Test worker] [115]
[INFO ] WELD-ENV-001007: Initialize Weld using ServletContextListener[2021-10-06T08:44:17.017Z] [org.jboss.weld.bootstrap.WeldStartup] [Test worker] [231] [INFO ] WELD-000101: Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously.
[2021-10-06T08:44:17.017Z] [org.jboss.weld.event.ExtensionObserverMethodImpl] [Test worker] [86]
[INFO ] WELD-000411: Observer method [BackedAnnotatedMethod] protected
org.apache.deltaspike.core.impl.exclude.extension.ExcludeExtension.vetoBeans(@Observes
ProcessAnnotatedType, BeanManager) receives events for all annotated
types. Consider restricting events using @WithAnnotations or a generic
type with bounds.
[2021-10-06T08:44:17.017Z] [org.jboss.weld.event.ExtensionObserverMethodImpl] [Test worker] [86]
[INFO ] WELD-000411: Observer method [BackedAnnotatedMethod] public org.apache.deltaspike.core.impl.interceptor.interdyn.InterDynExtension.processAnnotatedType(@Observes
ProcessAnnotatedType) receives events for all annotated types.
Consider restricting events using @WithAnnotations or a generic type
with bounds.
[2021-10-06T08:44:17.017Z]
[org.jboss.weld.event.ExtensionObserverMethodImpl] [Test worker] [86]
[INFO ] WELD-000411: Observer method [BackedAnnotatedMethod] protected
org.apache.deltaspike.core.impl.message.MessageBundleExtension.detectInterfaces(@Observes
ProcessAnnotatedType) receives events for all annotated types.
Consider restricting events using @WithAnnotations or a generic type
with bounds.
[2021-10-06T08:44:17.017Z]
[org.jboss.weld.event.ExtensionObserverMethodImpl] [Test worker] [86]
[INFO ] WELD-000411: Observer method [BackedAnnotatedMethod] protected
org.apache.deltaspike.core.impl.interceptor.GlobalInterceptorExtension.promoteInterceptors(@Observes
ProcessAnnotatedType) receives events for all annotated types.
Consider restricting events using @WithAnnotations or a generic type
with bounds.
[2021-10-06T08:44:17.017Z]
[org.jboss.weld.event.ExtensionObserverMethodImpl] [Test worker] [86]
[INFO ] WELD-000411: Observer method [BackedAnnotatedMethod] public
org.apache.deltaspike.core.impl.config.ConfigurationExtension.findDynamicConfigurationBeans(@Observes
ProcessAnnotatedType<?>) receives events for all annotated types.
Consider restricting events using @WithAnnotations or a generic type
with bounds.
[2021-10-06T08:44:18.018Z]
[org.jboss.weld.logging.ValidatorLogger] [Test worker] [59] [WARN ]
WELD-001478: Interceptor class
org.apache.deltaspike.core.impl.throttling.ThrottledInterceptor is
enabled for the application and for the bean archive
/tankkarte-service_/var/jenkins_home/.gradle/caches/modules-2/files-2.1/org.apache.deltaspike.core/deltaspike-core-impl/1.9.4/709e0b27bb80e52fcd6a886a216ca3f9c2b8c28/deltaspike-core-impl-1.9.4.jar.
It will only be invoked in the @Priority part of the chain.[2021-10-06T08:44:18.018Z] [org.jboss.weld.logging.ValidatorLogger]
[Test worker] [59] [WARN ] WELD-001478: Interceptor class
org.apache.deltaspike.core.impl.lock.LockedInterceptor is enabled for
the application and for the bean archive
/tankkarte-service_/var/jenkins_home/.gradle/caches/modules-2/files-2.1/org.apache.deltaspike.core/deltaspike-core-impl/1.9.4/709e0b27bb80e52fcd6a886a216ca3f9c2b8c28/deltaspike-core-impl-1.9.4.jar.
It will only be invoked in the @Priority part of the chain.[2021-10-06T08:44:18.018Z] [org.jboss.weld.logging.ValidatorLogger]
[Test worker] [59] [WARN ] WELD-001478: Interceptor class
org.apache.deltaspike.core.impl.future.FutureableInterceptor is
enabled for the application and for the bean archive
/tankkarte-service_/var/jenkins_home/.gradle/caches/modules-2/files-2.1/org.apache.deltaspike.core/deltaspike-core-impl/1.9.4/709e0b27bb80e52fcd6a886a216ca3f9c2b8c28/deltaspike-core-impl-1.9.4.jar.
It will only be invoked in the @Priority part of the chain.[2021-10-06T08:44:18.018Z] [org.jboss.weld.logging.ValidatorLogger]
[Test worker] [59] [WARN ] WELD-001478: Interceptor class
org.apache.deltaspike.core.impl.monitoring.InvocationMonitorInterceptor
is enabled for the application and for the bean archive
/tankkarte-service_/var/jenkins_home/.gradle/caches/modules-2/files-2.1/org.apache.deltaspike.core/deltaspike-core-impl/1.9.4/709e0b27bb80e52fcd6a886a216ca3f9c2b8c28/deltaspike-core-impl-1.9.4.jar.
It will only be invoked in the @Priority part of the chain.[2021-10-06T08:44:18.018Z]
[org.jboss.weld.environment.undertow.UndertowContainer] [Test worker]
[39] [INFO ] WELD-ENV-001302: Undertow detected, CDI injection will be
available in Servlets, Filters and Listeners.[2021-10-06T08:44:19.019Z] [org.jboss.weld.bootstrap.Validator]
[weld-worker-1] [200] [WARN ] WELD-001473:
javax.enterprise.inject.spi.Bean implementation
liquibase.integration.cdi.CDIBootstrap$1@7c73f99b declared a normal
scope but does not implement
javax.enterprise.inject.spi.PassivationCapable. It won’t be possible
to inject this bean into a bean with a passivating scope
(@SessionScoped, @ConversationScoped). This can be fixed by assigning
the Bean implementation a unique id by implementing the
PassivationCapable interface.
[2021-10-06T08:44:20.020Z] [liquibase.logging.core.Slf4jLogger] [Test worker] [42] [INFO ]
Booting Liquibase 3.6.2
[2021-10-06T08:44:20.020Z] [liquibase.logging.core.Slf4jLogger] [Test worker] [42] [INFO ] SELECT
COUNT() FROM PUBLIC.DATABASECHANGELOGLOCK
[2021-10-06T08:44:20.020Z] [liquibase.logging.core.Slf4jLogger] [Test worker] [42] [INFO ] SELECT COUNT() FROM PUBLIC.DATABASECHANGELOGLOCK[2021-10-06T08:44:20.020Z] [liquibase.logging.core.Slf4jLogger] [Test worker] [42] [INFO ] SELECT
LOCKED FROM PUBLIC.DATABASECHANGELOGLOCK WHERE ID=1[2021-10-06T08:44:20.020 Z] [liquibase.logging.core.Slf4jLogger] [Работник тестирования] [42] [ИНФОРМАЦИЯ ] Успешно получена блокировка журнала изменений
[2021-10-06T08:44:21.021 Z] [liquibase.logging.core.Slf4jLogger] [Работник тестирования] [42] [ИНФОРМАЦИЯ ] ВЫБЕРИТЕ MD5SUM ИЗ PUBLIC.DATABASECHANGELOG, ГДЕ MD5SUM НЕ РАВЕН НУЛЮ
[2021-10-06T08:44:21.021 Z] [liquibase.logging.core.Slf4jLogger] [Работник тестирования] [42] [ИНФОРМАЦИЯ ] ВЫБЕРИТЕ КОЛИЧЕСТВО(*) ИЗ PUBLIC.DATABASECHANGELOG
[2021-10-06T08:44:21.021 Z] [liquibase.logging.core.Slf4jLogger] [Тестовый работник] [42] [ИНФОРМАЦИЯ ] Чтение из PUBLIC.DATABASECHANGELOG
[2021-10-06T08:44:21.021 Z] [liquibase.logging.core.Slf4jLogger] [Тестовый работник] [42] [ИНФОРМАЦИЯ ] ВЫБЕРИТЕ * ИЗ PUBLIC.DATABASECHANGELOG ПОРЯДОК ПО ДАТЕ ВЫПОЛНЕНИЯ ASC, ПОРЯДОК ВЫПОЛНЕНИЯ ASC
[2021-10-06T08:44:21.021 Z] [liquibase.logging.core.Slf4jLogger] [Тестовый работник] [42] [ИНФОРМАЦИЯ ] Успешно снял блокировку журнала изменений
[2021-10-06T08:44:21.021 Z] [io.подводное течение.Подводное течение] [Тестовый работник] [252] [ИНФОРМАЦИЯ ] остановка сервера: Подводное течение — 2.1.3.Финал
Но в какой-то момент возникает исключение..
Есть какие-нибудь идеи о том, что я мог бы проверить, чтобы понять, почему это не удается только в моей среде Дженкинса ?
Я использую библиотеки org.jboss.resteasy 3.12.1.Final.
Комментарии:
1. Какую версию RESTEasy вы используете?
2. Я использую RestEasy 3.12.1.Финал — я отредактирую свой вопрос
3. Это определенно кажется странным. 3.12, скорее всего, на данный момент больше не увидит релизов. Последним релизом будет 5.0.0, в настоящее время он находится на уровне Beta1, а финал выйдет очень скоро. Есть ли какие-либо шансы на обновление?
4. Я попытался перейти на restEasy 4.7.2.Final, но у меня та же проблема.. Может ли это исходить от Сварщика ? Я также попытался обновить его (до 4.0.2.Final) , но при запуске теста я получаю исключение : Класс приемника org.jboss.weld.environment.undertow. WeldServletExtension не определяет и не наследует реализацию разрешенного метода абстрактного пустого обработанного развертывания(io.undertow.servlet.api.DeploymentInfo, javax.servlet. ServletContext)’ интерфейса ввода-вывода.подводный поток.сервлет. Расширение сервлета
5. Это определенно могло исходить от сварного шва. На самом деле трудно сказать.