我有一个在 IntelliJ(使用 Gradle 运行测试)和 Gradle 命令行中本地工作的 JAX-RS 集成测试。
但是当我在 Jenkins 中运行测试时,测试失败了,在 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);
}
当测试在 Jenkins 中运行时,我得到一个 NullPointerException :
java.lang.RuntimeException: java.lang.NullPointerException at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:254) at org.jboss.resteasy.plugins.server.undertow.UndertowJaxrsServer.deploy(UndertowJaxrsServer.java :266)
...
原因:org.jboss.weld.servlet.api.helpers.ForwardingServletListener.contextInitialized(ForwardingServletListener.contextInitialized(WeldInitialListener.java:94) 的 java.lang.NullPointerException java:34) 在 org.jboss.weld.environment.servlet.Listener.contextInitialized(Listener.java:121) 在 io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:187) 在 io.undertow.servlet .core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:217) at io.undertow.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:186) at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction. java:42) 在 io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43) 在 io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:252)
查看 Weld 源代码(在weld-web-3.1.2.Final 中),似乎从这里的最后一行抛出了异常:
@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());
}
虽然部分测试正在运行,但我可以看到这些日志:
[2021-10-06T08:44:16.016Z] [io.undertow.Undertow] [测试工作者] [117] [INFO] 启动服务器:Undertow - 2.1.3.Final
[2021-10-06T08:44:16.016Z] [org.xnio.Xnio] [测试工作者] [95] [INFO] XNIO 版本 3.8.0.Final
[2021-10-06T08:44:16.016Z] [org.xnio.nio.NioXnio] [测试工作者] [59] [INFO] XNIO NIO 实施版本 3.8.0.Final
[2021-10-06T08:44:16.016Z] [org.jboss.threads.Version] [Test worker] [52] [INFO] JBoss Threads 版本 3.1.0.Final
[2021-10-06T08:44:17.017Z] [org.jboss.weld.environment.servlet.Listener] [Test worker] [115] [INFO] WELD-ENV-001007:使用 ServletContextListener 初始化 Weld
[2021-10-06T08:44:17.017Z] [org.jboss.weld.bootstrap.WeldStartup] [测试工人] [231] [INFO] WELD-000101:事务服务不可用。@Inject UserTransaction 的注入不可用。事务性观察者将被同步调用。
[2021-10-06T08:44:17.017Z] [org.jboss.weld.event.ExtensionObserverMethodImpl] [测试工作者] [86] [INFO] WELD-000411:观察者方法 [BackedAnnotatedMethod] 保护 org.apache.deltaspike.core .impl.exclude.extension.ExcludeExtension.vetoBeans(@Observes ProcessAnnotatedType, BeanManager) 接收所有带注释类型的事件。考虑使用 @WithAnnotations 或带边界的泛型类型来限制事件。
[2021-10-06T08:44:17.017Z] [org.jboss.weld.event.ExtensionObserverMethodImpl] [测试工作者] [86] [INFO] WELD-000411:观察者方法 [BackedAnnotatedMethod] public org.apache.deltaspike.core .impl.interceptor.interdyn.InterDynExtension.processAnnotatedType(@Observes ProcessAnnotatedType) 接收所有带注释类型的事件。考虑使用 @WithAnnotations 或带边界的泛型类型来限制事件。
[2021-10-06T08:44:17.017Z] [org.jboss.weld.event.ExtensionObserverMethodImpl] [测试工作者] [86] [INFO] WELD-000411:观察者方法 [BackedAnnotatedMethod] 保护 org.apache.deltaspike.core .impl.message.MessageBundleExtension.detectInterfaces(@Observes ProcessAnnotatedType) 接收所有带注释类型的事件。考虑使用 @WithAnnotations 或带边界的泛型类型来限制事件。
[2021-10-06T08:44:17.017Z] [org.jboss.weld.event.ExtensionObserverMethodImpl] [测试工作者] [86] [INFO] WELD-000411:观察者方法 [BackedAnnotatedMethod] 保护 org.apache.deltaspike.core .impl.interceptor.GlobalInterceptorExtension.promoteInterceptors(@Observes ProcessAnnotatedType) 接收所有带注释类型的事件。考虑使用 @WithAnnotations 或带边界的泛型类型来限制事件。
[2021-10-06T08:44:17.017Z] [org.jboss.weld.event.ExtensionObserverMethodImpl] [测试工作者] [86] [INFO] WELD-000411:观察者方法 [BackedAnnotatedMethod] public org.apache.deltaspike.core .impl.config.ConfigurationExtension.findDynamicConfigurationBeans(@Observes ProcessAnnotatedType<?>) 接收所有带注释类型的事件。考虑使用 @WithAnnotations 或带边界的泛型类型来限制事件。
[2021-10-06T08:44:18.018Z] [org.jboss.weld.logging.ValidatorLogger] [测试工人] [59] [警告] WELD-001478:拦截器类 org.apache.deltaspike.core.impl.throttling .ThrottledInterceptor 已为应用程序和 bean 归档 /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。它只会在链的@Priority 部分中调用。
[2021-10-06T08:44:18.018Z] [org.jboss.weld.logging.ValidatorLogger] [测试工人] [59] [警告] WELD-001478:拦截器类 org.apache.deltaspike.core.impl.lock .LockedInterceptor 已为应用程序和 bean 归档 /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。它只会在链的@Priority 部分中调用。
[2021-10-06T08:44:18.018Z] [org.jboss.weld.logging.ValidatorLogger] [测试工人] [59] [警告] WELD-001478:拦截器类 org.apache.deltaspike.core.impl.future .FutureableInterceptor 已为应用程序和 bean 存档 /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。它只会在链的@Priority 部分中调用。
[2021-10-06T08:44:18.018Z] [org.jboss.weld.logging.ValidatorLogger] [测试工人] [59] [警告] WELD-001478:拦截器类 org.apache.deltaspike.core.impl.monitoring .InvocationMonitorInterceptor 已为应用程序和 bean 归档 /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。它只会在链的@Priority 部分中调用。
[2021-10-06T08:44:18.018Z] [org.jboss.weld.environment.undertow.UndertowContainer] [测试工人] [39] [INFO] WELD-ENV-001302:检测到 Undertow,CDI 注入将在Servlet、过滤器和监听器。
[2021-10-06T08:44:19.019Z] [org.jboss.weld.bootstrap.Validator] [weld-worker-1] [200] [WARN] WELD-001473:javax.enterprise.inject.spi.Bean 实现liquibase.integration.cdi.CDIBootstrap$1@7c73f99b 声明了一个正常范围,但没有实现 javax.enterprise.inject.spi.PassivationCapable。不可能将此 bean 注入具有钝化范围(@SessionScoped、@ConversationScoped)的 bean。这可以通过实现 PassivationCapable 接口为 Bean 实现分配唯一 id 来解决。
[2021-10-06T08:44:20.020Z] [liquibase.logging.core.Slf4jLogger] [测试工作者] [42] [信息] 引导 Liquibase 3.6.2 [2021-10-06T08:44:20.020Z] [liquibase .logging.core.Slf4jLogger] [测试工作者] [42] [INFO]从 PUBLIC.DATABASECHANGELOGLOCK [2021-10-06T08:44:20.020Z] [liquibase.logging.core.Slf4jLogger] [测试工作者]中选择 COUNT() [42] [INFO]从 PUBLIC.DATABASECHANGELOGLOCK 中选择 COUNT()
[2021-10-06T08:44:20.020Z] [liquibase.logging.core.Slf4jLogger] [测试工作者] [42] [信息] 从 PUBLIC.DATABASECHANGELOGLOCK 中选择锁定,其中 ID = 1
[2021-10-06T08:44:20.020Z] [liquibase.logging.core.Slf4jLogger] [Test worker] [42] [INFO] 成功获取更改日志锁
[2021-10-06T08:44:21.021Z] [liquibase.logging.core.Slf4jLogger] [测试工作者] [42] [INFO] 从 PUBLIC.DATABASECHANGELOG 中选择 MD5SUM,其中 MD5SUM 不为空
[2021-10-06T08:44:21.021Z] [liquibase.logging.core.Slf4jLogger] [测试工作者] [42] [信息] 从 PUBLIC.DATABASECHANGELOG 中选择计数(*)
[2021-10-06T08:44:21.021Z] [liquibase.logging.core.Slf4jLogger] [测试工作者] [42] [INFO] 从 PUBLIC.DATABASECHANGELOG 读取
[2021-10-06T08:44:21.021Z] [liquibase.logging.core.Slf4jLogger] [测试工作者] [42] [INFO] 从 PUBLIC.DATABASECHANGELOG 中选择 * 按日期执行 ASC,ORDEREXECUTED ASC
[2021-10-06T08:44:21.021Z] [liquibase.logging.core.Slf4jLogger] [Test worker] [42] [INFO] 成功释放更改日志锁
[2021-10-06T08:44:21.021Z] [io.undertow.Undertow] [测试工作者] [252] [INFO] 停止服务器:Undertow - 2.1.3.Final
但在某些时候,抛出异常..
知道我可以检查什么以了解为什么这只在我的 Jenkins 环境中失败?
我正在使用 org.jboss.resteasy 3.12.1.Final 库。