4

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

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

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

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

4

6 回答 6

7

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

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

第一点。您在这里使用的是“固定”版本(而不是“ SNAPSHOT”)。使用时,每次构建时SNAPSHOT,maven都会自动抓取最新的。另一方面,当您使用 1.0 时,一旦 maven 下载了这个工件,它就不会尝试获取新的 1.0。因此,您应该增加 Y 的版本,或者,如果 Y 正在积极开发中(增强功能、错误修复等),您应该真正使用. 有关 的更多信息,请查看第9.3.1.2 章。Sonatype 的书的快照版本:SNAPSHOT SNAPSHOTSNAPSHOT

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

第二点。您正在使用provided范围。根据第 9.4.1 章。依赖范围

provided当您期望 JDK 或容器提供依赖项时,将使用依赖项。例如,如果您正在开发一个 Web 应用程序,您将需要 compile classpath 中可用的 Servlet API 来编译 servlet,但您不希望在打包的 WAR 中包含 Servlet API;Servlet API JAR 由您的应用程序服务器或 servlet 容器提供。provided 依赖项在编译类路径(不是运行时)上可用。它们不是传递的,也不是打包的。

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

于 2009-10-08T17:32:59.567 回答
0

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

于 2009-10-08T16:55:51.543 回答
0

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

于 2009-10-08T16:56:15.520 回答
0

您在构建项目 Y 之前尝试过mvn clean吗?

于 2009-10-08T17:01:30.567 回答
0

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

工作区分辨率截图 http://docs.codehaus.org/download/attachments/11403480/project-properties.png

如果这两个项目密切相关,您可以考虑创建一个多模块构建,以便同时构建项目 X 和 Y。

于 2009-10-08T17:02:10.017 回答
0

好的,对不起,迟到的信息。

X包是ejb,所以X.jar没有lib目录。

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

谢谢大家。

于 2009-10-08T20:53:33.687 回答