我有一个Java项目X在项目Y上有依赖关系(在pom文件中)。
我在Y中修改并使用Maven工具构建X,Y然后在没有问题的情况下运行X(在JBoss上)。
当我在Y中添加新类然后使用Maven构建(没有问题),然后运行X时,它会为新类抛出java.lang.NoClassDefFoundError
。
我认为它是一个Maven依赖版本或类似的东西......我主要在谷歌搜索但没有任何效果......如何解决这个问题?
答案 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
如果两个项目密切相关,您可以考虑创建multi-module build,以便同时构建项目X和Y.
答案 5 :(得分:0)
好的,抱歉迟到的信息。
X包是ejb,因此X.jar没有lib目录。
然后Y.jar应该放在Jboss / server / default / lib中,它可以正常工作。
Thanx for all。