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

2022-09-03 17:27:27

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

我有一个主项目,其中包含子项目 、 和 。 包含 一些常见的功能(主要是接口),这是 和 需要的。我可以从项目根目录(目录)运行并获取 JAR 文件 、 和 。(所有这些工件的版本当前都是 。)MABCCABmvn compile jar:jarMA.jarB.jarC.jar2.0-SNAPSHOT

目录中的主文件在其标记下列出,以便 和 可以通过包含引用来引用,如下所示:pom.xmlMC<dependencyManagement>ABC

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

目前为止,一切都好。我可以从命令行运行,一切正常。但是当我在 NetBeans 中打开该项目时,它抱怨了以下问题:“某些依赖项工件不在本地存储库中”,它说缺少的工件是 。同样,从命令行,如果我切换到 or 目录并尝试运行,我会收到“生成错误:无法解决工件”。mvn compileCABmvn compile

我希望我可以手动转到构建和运行的地方,但我宁愿找到一个解决方案,使我能够直接在 NetBeans 中工作(和/或使用 m2eclipse 在 Eclipse 中工作)。C.jarmvn install:install-file

我做错了什么?


答案 1

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

旁注:你不应该调用 mvn 编译 jar:jar,而应该更喜欢 mvn 包。首先,运行该阶段将触发之前(包括)和自身的所有阶段。其次,运行将根据项目的价值调用 、or 等(有关此的更多详细信息,请查看生命周期简介)。这是Maven的一大优势:你不需要知道项目是否是JAR,WAR,EJB等,并运行适当的目标来打包它。只需运行标准化阶段,Maven 就会完成这项工作(使用默认目标绑定)。packagepackagecompilepackagepackagejar:jarwar:war<packaging>package

这是针对Maven理论部分的。在IDE内部,事情可能会略有不同,以使使用Maven更方便。IDE 可以使用项目依赖项(即对 IDE 内部代码的依赖项)而不是二进制依赖项,以便一个项目中所做的更改在其他模块中可见,而无需运行 。这就是Eclipse + M2Eclipse的情况。这也适用于在以下情况下的 NetBeans(请参见依赖关系管理):mvn install

提示:如果打开其他项目所依赖的项目,则其他项目中的图标将更改为“maven 项目”图标,以表示 IDE 知道项目之间的链接。但是,仅当 groupId、artifactId 和版本在依赖项和项目声明中都匹配时,才会建立这样的链接。经常发生的问题是,您在库项目中更改了 API 签名,但应用程序未拾取。通常,这是由于应用程序使用的是旧版本的库项目。项目图标可以帮助您跟踪这些问题。


答案 2

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

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


推荐