如何让一个Maven模块依赖另一个?
好的,我以为我明白了如何使用Maven ……
我有一个主项目M
,它有子项目A
, B
和C
C
包含A
和B
所需的一些常用function(主要是接口)。 我可以从项目根目录( M
目录)运行mvn compile jar:jar
并获取JAR文件A.jar
, B.jar
和C.jar
。 (所有这些工件的版本目前都是2.0-SNAPSHOT
。)
M
目录中的主pom.xml
文件在其标记下列出了
C
,因此A
和B
可以通过仅包含引用来引用C
,如下所示:
my.project C
到现在为止还挺好。 我可以从命令行运行mvn compile
,一切正常。 但是当我在NetBeans中打开项目时,它会抱怨问题:“某些依赖项工件不在本地存储库中”,并且它表示缺少的工件是C
同样从命令行,如果我更改为A
或B
目录并尝试运行mvn compile
我会得到“构建错误:无法解决工件”。
我希望我可以手动转到我的C.jar
构建的地方并运行mvn install:install-file
,但我宁愿找到一个解决方案,使我能够直接在NetBeans中工作(和/或使用m2eclipse在Eclipse中)。
我究竟做错了什么?
Maven依赖于二进制依赖的概念,并通过本地存储库解析它们。 换句话说,如果您之间存在依赖关系,则需要在本地存储库中“安装”软件包,编译和打包代码是不够的。 为此,您需要运行install
(将软件包安装到本地存储库中,以便在本地作为其他项目的依赖项 )。
旁注:你不应该调用mvn compile jar:jar
但是更喜欢mvn package
。 首先,运行package
阶段将触发package
(包括compile
)和package
本身之前的所有阶段。 其次,运行package
将调用jar:jar
或war:war
等,具体取决于项目的
值(有关详细信息,请查看生命周期的介绍 )。 这是Maven的一大优势:你不需要知道项目是JAR,WAR,EJB等,并且运行适当的目标来打包它。 只需运行标准化的package
阶段,Maven即可完成工作(使用默认目标绑定)。
这是Maven的理论部分。 在IDE中,事情可能略有不同,使得使用Maven更方便。 IDE可以使用项目依赖项 (即依赖于IDE内部的代码)而不是二进制依赖项,以便在一个项目中进行的更改在其他模块中可见,而无需运行mvn install
。 这是Eclipse + M2Eclipse的情况。 这也适用于以下条件下的NetBeans(请参阅依赖关系管理 ):
提示:如果您打开其他项目所依赖的项目,则其他项目中的图标将更改为“maven项目”图标,以表示IDE了解项目之间的链接。 但是,仅当groupId,artifactId和version在依赖项和项目声明中都匹配时才建立此类链接。 经常出现的问题是您在库项目中更改了API签名,但应用程序没有恢复。 通常是由应用程序使用旧版本的库工件引起的。 工件图标可以帮助您追踪这些问题。
您需要运行mvn install
而不是mvn compile
。 install
目标将在编译和打包后将构建的jar复制到本地存储库中。 如果只运行compile,它只会将类文件编译到target
目录中,而不会使它们可用于其他项目。
在Eclipse中,如果从顶层导入pom,它会将子项目导入单独的Eclipse项目并设置相关项目的依赖项,然后设置每个项目的类路径以依赖其他项目。 我不熟悉Netbeans,但我很确定有一些方法可以做同样的事情。
netbeans通过本地存储库内容将项目链接在一起,因此在大多数情况下都需要安装mvn。
这不是真的,执行部署将完成以前的所有设置……
请看看:
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html