Maven提供的依赖项的ClassNotFoundException

时间:2014-04-21 21:08:34

标签: java maven jboss jboss7.x classnotfoundexception

我有一个Web应用程序依赖于另一个maven项目,该项目在其pom文件中提供了一些依赖项。

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.12</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-jaxrs</artifactId>
    <version>1.9.12</version>
    <scope>provided</scope>
</dependency>

当我将战争部署到JBoss时,我获得了Jackson-mapper-asl jar中的JsonSerializer和Deserializer的ClassNotFoundExceptions。

Caused by: java.lang.ClassNotFoundException: org.codehaus.jackson.map.JsonDeserializer from [Module "deployment.biz.modit.tit.gop.education.teacherportlets.createtest-0.0.1-SNAPSHOT.war:main" from Service Module Loader]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190) [jboss-modules.jar:1.1.1.GA]
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468) [jboss-modules.jar:1.1.1.GA]
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456) [jboss-modules.jar:1.1.1.GA]
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398) [jboss-modules.jar:1.1.1.GA]
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120) [jboss-modules.jar:1.1.1.GA]
... 26 more

如果我没有错误提供意味着运行时或我的案例应用程序服务器将提供jar。 jackson-mapper-asl jar作为模块安装在JBoss服务器上。我认为问题是由版本号不匹配造成的,但是更新jboss模块中的jar并更新module.xml-s没有帮助。我尝试将其部署到deployments文件夹中,因为它之前使用ojdbc驱动程序有所帮​​助,但这也无济于事。你能提出一些建议吗?

3 个答案:

答案 0 :(得分:2)

<scope>provided</scope>更改为<scope>compile</scope>

  

编译 - 这是默认范围,如果未指定,则使用。编译依赖项在项目的所有类路径中都可用。此外,这些依赖项将传播到依赖项目。

     

提供 - 这很像compile,但表示您希望JDK或容器在运行时提供依赖性。例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类。此范围仅在编译和测试类路径中可用,并且不具有传递性。

参考http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

答案 1 :(得分:1)

由于服务器已经提供了依赖项,因此您只需确保部署依赖于模块。您可以在documentation

中获取有关如何添加模块依赖关系的更多详细信息

对于WAR,只需在pom中添加以下内容即可。

<build>
   ...
   <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-war-plugin</artifactId>
       <configuration>
          <archive>
             <manifestEntries>
                <Dependencies>org.codehaus.jackson.jackson-jaxrs,org.codehaus.jackson.jackson-mapper-asl</Dependencies>
             </manifestEntries>
          </archive>
       </configuration>
     </plugin>
   </plugins>
</build>

答案 2 :(得分:0)

您可以将包含所需依赖项的模块添加到WAR的META-INF / jboss-deployment-structure.xml中(请参阅“JBoss部署结构文件”部分here