Maven依赖版本控制和java.lang.NoClassDefFoundError

时间:2009-10-08 16:47:51

标签: java maven-2 maven-plugin

我有一个Java项目X在项目Y上有依赖关系(在pom文件中)。

我在Y中修改并使用Maven工具构建X,Y然后在没有问题的情况下运行X(在JBoss上)。

当我在Y中添加新类然后使用Maven构建(没有问题),然后运行X时,它会为新类抛出java.lang.NoClassDefFoundError

我认为它是一个Maven依赖版本或类似的东西......我主要在谷歌搜索但没有任何效果......如何解决这个问题?

6 个答案:

答案 0 :(得分:7)

Moro,您在评论中写道,X声明了以下依赖项:

<dependency>
  <groupId>Y</groupId>
  <artifactId>Y</artifactId>
  <scope>provided</scope>
  <version>1.0</version>
</dependency>

第一点。您在这里使用的是“固定”版本(而不是“SNAPSHOT”)。使用SNAPSHOT时,maven会自动获取您构建的最新SNAPSHOT 。另一方面,当您使用1.0时,一旦maven下载了此工件,从不尝试获取新的1.0。因此,您应该增加Y的版本,或者,如果Y处于活动开发(增强,错误修复等),您应该使用SNAPSHOT。 有关SNAPSHOT的更多信息,请查看Sonatype的书籍9.3.1.2. SNAPSHOT Versions一章:

  

你为什么要用这个?快照   版本用于下的项目   积极发展。如果你的项目   取决于软件组件   正在积极发展,你可以   取决于SNAPSHOT版本,和   Maven会定期尝试   从a下载最新的快照   运行构建时的存储库。   同样,如果您的下一个版本   系统将有一个版本   “1.4”,你的项目将有一个   版本“1.4-SNAPSHOT”直到它   正式发布。

第二点。您使用的是provided范围。根据章节 9.4.1. Dependency Scope

  当使用

provided个依赖项时   你期望JDK或容器   提供他们。例如,如果你是   开发一个Web应用程序,你   需要Servlet API   在编译类路径上编译一个   servlet,但你不想   包括Servlet API   打包WAR; Servlet API JAR是   由您的应用程序服务器提供或   servlet容器。 provided   依赖关系可用于   编译类路径(不是运行时)。   它们不是传递性的,也不是传递性的   包装

这真的是你想要的吗?你是如何在JBoss上部署X和Y的?你不应该使用默认的compile范围吗?

答案 1 :(得分:0)

在添加新课程后,您是否在Y上运行了mvn install

答案 2 :(得分:0)

您是否安装/部署了新版本的Y,为新的Y版本升级X的依赖项,并重新构建X?

答案 3 :(得分:0)

在构建项目Y之前,您是否尝试过 mvn clean

答案 4 :(得分:0)

Maven解析来自本地和远程存储库的依赖关系,尽管诸如m2eclipse之类的IDE插件也将解析工作空间中项目的依赖关系。如果您没有这样的插件,则需要将工件Y安装到本地存储库或将其部署到远程存储库,以便您和您的同事可以在Maven识别出构建项目时已进行更改之前访问它X

workspace resolution screenshot http://docs.codehaus.org/download/attachments/11403480/project-properties.png

如果两个项目密切相关,您可以考虑创建multi-module build,以便同时构建项目X和Y.

答案 5 :(得分:0)

好的,抱歉迟到的信息。

X包是ejb,因此X.jar没有lib目录。

然后Y.jar应该放在Jboss / server / default / lib中,它可以正常工作。

Thanx for all。