我有一个 Java 项目 X 对项目 Y 有依赖项(在 pom 文件中)。
我在 Y 中修改并使用 Maven 工具构建 X,Y,然后运行 X(在 JBoss 上)没有问题。
当我在 Y 中添加新类然后使用 Maven 构建(没有问题),然后运行 X 时,它会抛出java.lang.NoClassDefFoundError
新类。
我认为它是一个 Maven 依赖版本控制或类似的东西......我主要在谷歌搜索,但没有任何效果......如何解决这个问题?
我有一个 Java 项目 X 对项目 Y 有依赖项(在 pom 文件中)。
我在 Y 中修改并使用 Maven 工具构建 X,Y,然后运行 X(在 JBoss 上)没有问题。
当我在 Y 中添加新类然后使用 Maven 构建(没有问题),然后运行 X 时,它会抛出java.lang.NoClassDefFoundError
新类。
我认为它是一个 Maven 依赖版本控制或类似的东西......我主要在谷歌搜索,但没有任何效果......如何解决这个问题?
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
SNAPSHOT
SNAPSHOT
你为什么要用这个?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
范围吗?
mvn install
添加新课程后,您是否在 Y 上运行?
您是否安装/部署了新版本的 Y,升级了新版本的 X 的依赖项,并重新构建了 X?
您在构建项目 Y 之前尝试过mvn clean吗?
Maven 解析来自本地和远程存储库的依赖项,尽管诸如m2eclipse之类的 IDE 插件也将解析作为工作区中项目的依赖项。如果您没有这样的插件,则需要将工件 Y 安装到本地存储库或将其部署到远程存储库,以便您和您的同行可以在 Maven 识别构建项目时进行更改之前访问它X。
工作区分辨率截图 http://docs.codehaus.org/download/attachments/11403480/project-properties.png
如果这两个项目密切相关,您可以考虑创建一个多模块构建,以便同时构建项目 X 和 Y。
好的,对不起,迟到的信息。
X包是ejb,所以X.jar没有lib目录。
然后 Y.jar 应该放在 Jboss/server/default/lib 中,它可以正常工作。
谢谢大家。