如何使一个 Maven 模块依赖于另一个?

Posted

技术标签:

【中文标题】如何使一个 Maven 模块依赖于另一个?【英文标题】:How can I make one Maven module depend on another? 【发布时间】:2011-01-31 11:58:59 【问题描述】:

好吧,我以为我了解如何使用 Maven...

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

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

<dependency>
    <groupId>my.project</groupId>
    <artifactId>C</artifactId>
</dependency>

到目前为止,一切都很好。我可以从命令行运行mvn compile,一切正常。但是当我在 NetBeans 中打开项目时,它会抱怨以下问题:“某些依赖项工件不在本地存储库中”,并且它说缺少的工件是 C。同样从命令行,如果我切换到 AB 目录并尝试运行 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:jarwar:war 等,具体取决于项目的&lt;packaging&gt; 值(查看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 packagemvn jar:jar :) 很高兴您发现该链接很有用。 是否可以将模块的install 作为父compile 的一部分运行?【参考方案2】:

您需要运行mvn install 而不是mvn compileinstall 目标将编译打包后的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?

访问如何使一个单元格值依赖于另一个单元格中的值

如何创建依赖于另一个 JAR 的 JAR?

从服务器中的两个 selectInputs 中,如何使一个依赖于另一个?

如何使用ZF2中的数组表单设置使字段验证依赖于另一个字段?

如何使一个材料表列的编辑模式字段类型依赖于另一列的值,而不影响其他行?