我有一个简单的设置,war文件只包含一个web.xml,它指定要在servlet中使用的javax.ws.rs.Application类。
包含javax.ws.rs.Application实现的jar也非常简单。 web.xml和实现都基于jboss documentation
中的示例然而,当我在jboss AS 7.1.1 Final与jboss 4.0.4中部署war + jar组合时,我得到了不同的行为。在访问其余的api后,我在jboss日志中获得了以下异常(仅限代码段):
06:33:59,540 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/wrapper]] (MSC service thread 1-2) StandardWrapper.Throwable: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.projectgoth.provider.restapi.RestApiProvider from [Module "deployment.wrapper.war:main" from Service Module Loader]
at org.jboss.resteasy.spi.ResteasyDeployment.createFromInjectorFactory(ResteasyDeployment.java:271) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.spi.ResteasyDeployment.createApplication(ResteasyDeployment.java:259) [resteasy-jaxrs-2.3.2.Final.jar:]
但是,如果我在war的pom.xml中将jar的范围从提供更改为运行时 - 错误确实远离了jboss 7.1.1。
作为参考,我已经将war和jar的代码用法上传到bitbucket(其中provider = implementation为javax.ws.rs.Application,而包装器是war可部署的)
答案 0 :(得分:0)
我认为这很正常。 Per class loader policy, a child class can always see the parent class not the vice verse
。当您将jar作为运行时,JAR将加载到流中的类路径中而不是WAR应用程序,因此它对WAR类是可见的。