如何让一个Maven模块依赖另一个?

时间:2010-03-24 22:30:44

标签: java maven-2 netbeans

好的,我想到我明白了如何使用Maven ...

我有一个主项目M,其中包含子项目ABCC包含AB所需的一些常用功能(主要是接口)。我可以从项目根目录(mvn compile jar:jar目录)运行M并获取JAR文件A.jarB.jarC.jar。 (所有这些工件的版本目前都是2.0-SNAPSHOT。)

pom.xml目录中的主M文件在C标记下列出<dependencyManagement>,以便AB可以引用{ {1}}只需包含一个引用,如下所示:

C

到目前为止,这么好。我可以从命令行运行<dependency> <groupId>my.project</groupId> <artifactId>C</artifactId> </dependency> ,一切正常。但是当我在NetBeans中打开项目时,它会抱怨问题:“某些依赖项工件不在本地存储库中”,并且它表示缺少的工件是mvn compile。同样,从命令行开始,如果我更改为CA目录并尝试运行B,我会收到“构建错误:无法解决工件。”

我希望我可以手动转到构建mvn compile并运行C.jar的位置,但我宁愿找到一种解决方案,使我能够直接在NetBeans中工作(和/或在Eclipse中)使用m2eclipse)。

我做错了什么?

4 个答案:

答案 0 :(得分:23)

Maven依赖于二进制依赖的概念,并通过本地存储库解析它们。换句话说,如果您之间存在依赖关系,则需要在本地存储库中“安装”软件包,编译和打包代码是不够的。为此,您需要运行 install (将将软件包安装到本地存储库,以用作本地其他项目的依赖项)。

附注:您不应该调用 mvn compile jar:jar ,而是更喜欢 mvn package 。首先,运行package阶段将触发package(包括compile)和package之前的所有阶段。其次,运行package会调用jar:jarwar:war等,具体取决于项目的<packaging>值(有关详细信息,请查看introduction to the lifecycle) 。这是Maven的一大优势:你不需要知道项目是JAR,WAR,EJB等,并且运行适当的目标来打包它。只需运行标准化package阶段,Maven即可完成工作(使用默认目标绑定)。

那是Maven的理论部分。在IDE中,事情可能略有不同,使得使用Maven更方便。 IDE可以使用 项目依赖项 (即依赖于IDE中的代码)而不是二进制依赖项,以便在一个项目中进行的更改在其他模块中可见,而无需运行{ {1}}。这是Eclipse + M2Eclipse的情况。这也适用于以下条件下的NetBeans(请参阅Dependency Management):

  

提示:如果您打开其他项目   项目依赖于,其他的图标   项目变为“maven项目”   图标表示IDE知道   关于项目之间的联系。   但是这样的链接只是   在groupId时建立,   artifactId和版本全部匹配   依赖和项目   宣言。经常发生   问题是你改变了一个API   您的图书馆项目中的签名,但是   应用程序没有恢复。   通常它是由事实引起的   应用程序使用的是旧版本   库神器。神器   图标可以帮助您追踪这些   问题。

答案 1 :(得分:6)

您需要运行mvn install而不是mvn compileinstall目标将在编译和打包后将构建的jar复制到本地存储库中。如果只运行compile,它只会将类文件编译到target目录中,而不会使它们可用于其他项目。

在Eclipse中,如果从顶层导入pom,它会将子项目导入单独的Eclipse项目并设置相关项目的依赖项,然后设置每个项目的类路径以依赖其他项目。我不熟悉Netbeans,但我很确定有一些方法可以做同样的事情。

答案 2 :(得分:3)

netbeans通过本地存储库内容将项目链接在一起,因此在大多数情况下都需要安装mvn。

答案 3 :(得分:0)

这不是真的,执行部署将完成之前的所有设置......

请看看:

http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html