如何使一个 Maven 模块依赖于另一个?
Posted
技术标签:
【中文标题】如何使一个 Maven 模块依赖于另一个?【英文标题】:How can I make one Maven module depend on another? 【发布时间】:2011-01-31 11:58:59 【问题描述】:好吧,我以为我了解如何使用 Maven...
我有一个主项目M
,它有子项目A
、B
和C
。 C
包含A
和B
需要的一些通用功能(主要是接口)。我可以从项目根目录(M
目录)运行 mvn compile jar:jar
并获取 JAR 文件 A.jar
、B.jar
和 C.jar
。 (所有这些工件的版本目前都是2.0-SNAPSHOT
。)
M
目录中的主文件pom.xml
在其<dependencyManagement>
标签下列出了C
,因此A
和B
可以通过仅包含引用来引用C
,如下所示:
<dependency>
<groupId>my.project</groupId>
<artifactId>C</artifactId>
</dependency>
到目前为止,一切都很好。我可以从命令行运行mvn compile
,一切正常。但是当我在 NetBeans 中打开项目时,它会抱怨以下问题:“某些依赖项工件不在本地存储库中”,并且它说缺少的工件是 C
。同样从命令行,如果我切换到 A
或 B
目录并尝试运行 mvn compile
我会收到“构建错误:无法解析工件。”
我希望我可以手动转到构建 C.jar
的位置并运行 mvn install:install-file
,但我宁愿找到一个解决方案,使我能够直接在 NetBeans 中(和/或在 Eclipse 中使用 m2eclipse)工作。
我做错了什么?
【问题讨论】:
【参考方案1】:Maven 依赖于二进制依赖的概念,并通过本地存储库解决它们。换句话说,如果它们之间存在依赖关系,则需要在本地存储库中“安装”包,编译和打包代码是不够的。为此,您需要运行 install
(这会将包安装到本地存储库中,以用作本地其他项目的依赖项)。
附注:您不应调用 mvn compile jar:jar
,而应优先调用 mvn package
。首先,运行package
阶段将触发package
之前的所有阶段(包括compile
)和package
本身。其次,运行package
将调用jar:jar
或war:war
等,具体取决于项目的<packaging>
值(查看introduction to the lifecycle 了解更多详细信息)。这是 Maven 的一大优势:您无需知道项目是 JAR、WAR、EJB 等,并运行适当的目标来打包它。只需运行标准化的package
阶段,Maven 就会完成这项工作(使用默认目标绑定)。
这是 Maven 理论部分。在 IDE 内部,为了更方便地使用 Maven,情况可能会略有不同。 IDE 可以使用 项目依赖项(即对 IDE 内部代码的依赖项)而不是二进制依赖项,以便在一个项目中所做的更改在其他模块中可见,而无需运行 @ 987654335@。这是 Eclipse + M2Eclipse 的情况。这也适用于以下条件下的 NetBeans(请参阅 Dependency Management):
提示:如果您打开一个其他 项目依赖,其他中的图标 项目更改为“Maven 项目” 表示 IDE 知道的图标 关于项目之间的联系。 然而这样的链接只是 当 groupId 建立时, artifactId 和版本都匹配 依赖和项目 宣言。经常发生 问题是你改变了一个API 在您的图书馆项目中签名,但是 应用程序没有收到。 这通常是由于以下事实引起的 应用程序正在使用旧版本 的图书馆神器。神器 图标可以帮助您追踪这些 问题。
【讨论】:
谢谢。我有点知道使用mvn package
而不是mvn compile
,但感谢您的提醒。但是,wiki.netbeans.org 上的“Maven 最佳实践”链接特别有用,因此我将此答案标记为已接受。
@Daniel 不客气。但旁注更多的是关于 mvn package
与 mvn jar:jar
:) 很高兴您发现该链接很有用。
是否可以将模块的install
作为父compile
的一部分运行?【参考方案2】:
您需要运行mvn install
而不是mvn compile
。 install
目标将编译打包后的jar 复制到本地仓库。如果只运行编译,它只会将类文件编译到target
目录中,而不会提供给其他项目使用。
在 Eclipse 中,如果从顶层导入 pom,它会将子项目导入到单独的 Eclipse 项目中,并设置相关项目的依赖关系,然后设置每个项目的类路径以依赖其他项目。我不熟悉 Netbeans,但我很确定有一些方法可以做同样的事情。
【讨论】:
【参考方案3】:netbeans 通过本地存储库内容将项目链接在一起,因此在大多数情况下 mvn install 是必需的。
【讨论】:
【参考方案4】:这不是真的,执行部署将完成之前的所有设置...
请看一下:
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
【讨论】:
以上是关于如何使一个 Maven 模块依赖于另一个?的主要内容,如果未能解决你的问题,请参考以下文章
如何使一个 ReactJS Store 依赖于另一个 Store?