JBoss:即使该类存在,部署也会因ClassNotFoundException而失败 - JaxrsScanningProcessor

时间:2014-02-14 10:49:28

标签: deployment jboss jax-rs

我有一个带REST服务的WAR文件。它在独立模式下在JBoss EAP 6.2(对应于AS 7.something)上部署得很好,但它有时 - 但经常 - 在域模式下,我的子类JAX-的ClassNotFoundException RS应用程序类,即使它在战争中(好吧,它是独立运行的)。由于它有时会起作用,我怀疑存在一些并发问题导致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

课程在那里:

[jboss/domain]$ unzip -l data/content/6c/0ffc675ff1c2254540b6e8caffc0d2605ed549/content | grep RestApp
     2262  02-13-14 09:05   WEB-INF/classes/myapp/rs/RestApplication.class

这是我部署它的方式(我的用户!=运行jboss的用户,如果这有所不同):

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/目录来完成独立部署。

任何提示?

配置信息

  1. JBoss EAP 6.2
  2. Rest Easy 3.0.6(替换默认的2.x模块)
  3. web.xml上下文参数外,resteasy.servlet.mapping.prefix中没有JAX-RS内容;我们使用resteasy-servlet-initializer库而不是在那里手动配置servlet或类似的东西

2 个答案:

答案 0 :(得分:3)

似乎我已经通过从WAR文件的WEB-INF/lib/删除所有resteasy / jaxrs / jboss库来解决问题。

我注意到战争包含了许多不应该的库,例如resteasy-jaxrs-3.0.6.Final.jar,jboss-jaxr-api_1.0_spec-1.0.0.Final.jar(其中,BTW,冲突使用Rest Easy 3.0.6),javax.servlet-api-3.1.0.jar等。

所以我认为类加载器没有看到/找到类,因为classpath地狱,服务器和webapp使用相同库的不同“实例”。 (不知道为什么它在JBoss独立版下工作;但是独立版具有开箱即用的配置,而域名已经过大量调整)。

我有时在部署命令中包含--runtime-name=myapp,这似乎是错误的,我应该使用--runtime-name=myapp.war(包括结尾)。

答案 1 :(得分:0)

尽管作者已经找到了自己的答案,但我认为发布我的情况可能是有用的,以防其他人遇到这个问题并且作者解决方案对他们不起作用。

我有一个类似的问题,当在Openshift内部的Redhat JBoss AS盒式磁带下运行时也找不到类,尽管它似乎不合理,但后来我发现我期待部署的战争没有部署而是部署了另一个。

ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/].[HelloWorld]] (http--127.10.254.129-8080-1) Allocate exception for servlet HelloWorld: java.lang.ClassNotFoundException: com.company.app.HelloWorld from [Module "deployment.ROOT.war:main" from Service Module Loader]
        at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)

因此,如果有可能,我会搜索所有预期拥有该类的war文件,解压缩它们并在内容中搜索它们是否包含所需的编译类。我真的建议你去寻找所有可能的战争。同时寻找可能的YOUR_WAR.war.deployed,它很可能与当前部署的战争位于同一个文件夹中。

就我而言,我有过这些战争:

./app-root/runtime/repo/deployments/ROOT.war
./app-root/runtime/dependencies/jbossas_custom/deployments/ROOT.war.deployed
./app-root/runtime/dependencies/jbossas_custom/deployments/ROOT.war

我期待真正的那个在 ./ app-root / runtime / repo / deployments / ROOT.wa r,因为这是maven创建它的地方,但似乎JBoss后来必须将它复制到 ./ app-root / runtime / dependencies / jbossas_custom / deployments / ROOT.war 在我的情况下它本身并没有这样做,因此我的更新战争从未部署过,相反它总是去部署旧的已经在 ./ app-root / runtime / dependencies / jbossas_custom / deployments / ROOT.war

希望这有助于某人走上正轨。