我有一个带有 REST 服务的 WAR 文件。它以独立模式在 JBoss EAP 6.2(对应于 AS 7.something)上部署得很好,但有时在域模式下失败 - 但经常 - 在域模式下,我的 JAX-RS Application 类的子类出现 ClassNotFoundException,即使它在 war 中(嗯,它独立运行)。由于它有时会起作用,我怀疑存在一些并发问题导致 JBoss 在看到它之前尝试加载该类。
这是错误:
ERROR [org.jboss.msc.service.fail] (MSC service thread 1-1) MSC000001: Failed to start service jboss.deployment.unit.myapp.POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.unit.myapp.POST_MODULE: JBAS018733: Failed to process phase POST_MODULE of deployment "myapp" at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:127) ... Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS011230: Could not load JAX-RS Application class at org.jboss.as.jaxrs.deployment.JaxrsScanningProcessor.scan(JaxrsScanningProcessor.java:218) at org.jboss.as.jaxrs.deployment.JaxrsScanningProcessor.deploy(JaxrsScanningProcessor.java:100) at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:120) [jboss-as-server-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14] ... 5 more Caused by: java.lang.ClassNotFoundException: myapp.rs.RestApplication from [Module "deployment.myapp:main" from Service Module Loader] at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:197) [jboss-modules.jar:1.3.0.Final-redhat-2] ... at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:118) [jboss-modules.jar:1.3.0.Final-redhat-2] at org.jboss.as.jaxrs.deployment.JaxrsScanningProcessor.scan(JaxrsScanningProcessor.java:214) ... 7 more
The class is there:
[jboss/domain]$ unzip -l data/content/6c/0ffc675ff1c2254540b6e8caffc0d2605ed549/content | grep RestApp 2262 02-13-14 09:05 WEB-INF/classes/myapp/rs/RestApplication.class
This is how I deployed it (my user != the user running jboss, if that makes a difference):
me$ /opt/jboss/bin/jboss-cli.sh -c --controller=0.0.0.0:49999 --user=admin --password=***
[domain@0.0.0.0:49999 /] deploy /vagrant/myapp.war --all-server-groups
通过 Web 管理控制台执行时,部署以相同的方式失败。通过将 .war 复制到
standalone/deployments/
来完成到独立的部署。目录。有小费吗?
配置信息
web.xml
中没有 JAX-RS 内容除了resteasy.servlet.mapping.prefix
上下文参数;我们使用 resteasy-servlet-initializer
库而不是在那里手动配置 servlet 或类似的东西 最佳答案
看来我已经通过从 WAR 文件的 WEB-INF/lib/
中删除所有 resteasy/jaxrs/jboss 库解决了这个问题。 .
我注意到 war 包含许多它不应该包含的库,例如 resteasy-jaxrs-3.0.6.Final.jar、jboss-jaxr-api_1.0_spec-1.0.0.Final.jar(顺便说一句,与 Rest Easy 冲突3.0.6)、javax.servlet-api-3.1.0.jar 等
所以我猜类加载器没有看到/找到类,因为类路径 hell ,服务器和 webapp 使用相同库的不同“实例”。 (不知道为什么它在 JBoss 独立下工作;但独立具有开箱即用的配置,而域已经调整了很多)。
我有时也包括--runtime-name=myapp
在部署命令中,这似乎是错误的,我应该使用 --runtime-name=myapp.war
(包括结尾)。
关于deployment - JBoss:即使类存在,部署也会失败并出现 ClassNotFoundException - JaxrsScanningProcessor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21777286/