2009-10-08 87 views
4

我有一个Java项目X对项目Y.Maven的依赖版本和java.lang.NoClassDefFoundError

我修改Y和构建X,Y与Maven工具,然后乳宁X的依赖(在POM文件)(在JBoss上)没有问题。

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

我认为它的Maven依赖版本或类似的东西...我主要搜索谷歌,但没有影响...如何解决这个问题?

+0

我注意到生成的x.jar没有包含y.jar的“lib”目录...我手动添加了这个...并且运行正常......但是现在,如何让Maven自动执行此操作(如果这是一个正确的解决方案)? – Moro 2009-10-14 17:37:42

回答

0

好的,对于迟到的信息抱歉。

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

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

Thanx所有。

0

您是否在添加新类后在Y上运行了mvn install

+0

是的,我做到了与MVN安装 – Moro 2009-10-08 16:57:35

0

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

+0

在Y POM具有版本 1.0和X POM具有相关性为ŸŸ提供 1.0 Moro 2009-10-08 17:02:15

0

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

+0

是干净然后安装Y ...和clean然后打包为X – Moro 2009-10-08 17:03:01

0

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

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

如果这两个项目是紧密相关的,你可以考虑创建一个multi-module build使项目X和Y在同一时间建成。

+0

1.它在存储库中,这样我使用安装命令2.它已经是一个多模块项目......并且我试图在父项目中构建它......但是同样的事情 – Moro 2009-10-08 17:07:28

7

摩洛,你在评论中写道,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会定期尝试 从 库下载最新的快照,当你运行构建。 同样,如果您的 系统的下一个版本将具有版本 “1.4”,那么您的项目将具有 版本“1.4-SNAPSHOT”,直到它正式发布为 。

第二点。您正在使用provided范围。据章 9.4.1. Dependency Scope:当你 期望JDK或 容器为他们提供

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

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

+0

刚刚使用 \t \t \t Ÿ \t \t 1.0快照 \t ,但它并没有把lib目录下,而不是运行 – Moro 2009-10-08 17:52:04

+0

那是因为你需要在Y中的VERSIONNUMBER改为1.0,快照,然后运行mvn安装。之后,正确的依赖关系可用 – Salandur 2009-10-08 18:04:30

+0

没有人,我已经做了 – Moro 2009-10-08 18:10:25