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

标签 java maven-2 netbeans

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

我有一个主项目 M其中有子项目A , B , 和 C . C包含 A 所需的一些常用功能(主要是接口(interface))和 B .我可以运行 mvn compile jar:jar从项目根目录(M 目录)获取 JAR 文件 A.jar , B.jar , 和 C.jar . (所有这些工件的版本当前为 2.0-SNAPSHOT。)

师傅pom.xml文件在 M目录列表 C在其下<dependencyManagement>标签,所以 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)。

我做错了什么?

最佳答案

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

旁注:您不应调用 mvn compile jar:jar ,而应调用 mvn package 。首先,运行 package 阶段将触发 package 之前的所有阶段(包括 compile )和 package 本身。其次,运行 package 将调用 jar:jarwar:war 等,具体取决于项目的 <packaging> 值(查看 introduction to the lifecycle 以获得更多详细信息)。这是 Maven 的一大优势:您不需要知道项目是 JAR、WAR、EJB 等,也不需要运行适当的目标来打包它。只需运行标准化的 package 阶段,Maven 就会完成这项工作(使用默认目标绑定(bind))。

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

Hint: If you open a project that other projects depend on, the icon in other projects changes to a "maven project" icon to denote that the IDE knows about link between the projects. However such a link is only established when the groupId, artifactId and version all match in the dependency and project declaration. Frequently occurring problem is that you change an API signature in your library project, but the application is not picking up. Often it's caused by the fact that the application is using an older version of the library artifact. The artifact icon can help you track down these problems.

关于java - 如何使一个 Maven 模块依赖于另一个模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2511908/

相关文章:

java - Android 自定义 View 不起作用

maven-2 - 如何使 Maven 模块不导出 jar?

unit-testing - 如何使用 maven-surefire-plugin 在同一项目中执行 JUnit 和 TestNG 测试?

maven-2 - 私有(private)内部 Maven 存储库

maven-2 - Maven 对另一个非存储库项目的依赖?

java - 了解幸存世代指标

java - 简单的 Autowiring ="byName"不起作用

java - drop-and-create-tables 太容易掉落

mysql - Netbeans 无法连接到 MAMP 上的 MySQL 服务器

java - 如何为这种情况编写 Cypher 查询?