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

好的,我以为我明白了如何使用Maven ……

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

M目录中的主pom.xml文件在其标记下列出了C ,因此AB可以通过仅包含引用来引用C ,如下所示:

  my.project C  

到现在为止还挺好。 我可以从命令行运行mvn compile ,一切正常。 但是当我在NetBeans中打开项目时,它会抱怨问题:“某些依赖项工件不在本地存储库中”,并且它表示缺少的工件是C 同样从命令行,如果我更改为AB目录并尝试运行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:jarwar: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 compileinstall目标将在编译和打包后将构建的jar复制到本地存储库中。 如果只运行compile,它只会将类文件编译到target目录中,而不会使它们可用于其他项目。

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

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

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

请看看:

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