我有一个带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/
目录来完成独立部署。
任何提示?
web.xml
上下文参数外,resteasy.servlet.mapping.prefix
中没有JAX-RS内容;我们使用resteasy-servlet-initializer
库而不是在那里手动配置servlet或类似的东西答案 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
希望这有助于某人走上正轨。