我有两个maven java项目(比如项目A和项目B(。我已将项目 B 作为依赖项放置在项目 A 中,因为项目 A 需要项目 B 的某些服务。我喜欢下面pom.xml
<dependency>
<groupId>com.projectB</groupId>
<artifactId>api-projectB</artifactId>
<version>1.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
一切看起来都不错,但是当我为项目A做maven install
时,我收到了以下警告
[WARNING] The POM for com.projectB:api-projectB:jar:1.1-SNAPSHOT is missing, no dependency information available
这会导致构建失败,并显示如下所示的消息
[ERROR] Failed to execute goal on project api-projectB: Could not resolve dependencies for project com.projectB:api-projectB:jar:1.1-SNAPSHOT: Could not find artifact com.projectB:api-projectB:jar:1.1-SNAPSHOT -> [Help 1]
如何在为项目 A 执行maven install
时生成项目 B jar。我知道,如果我先为项目B做maven install
,然后再为项目A做maven install
,一切都会好起来的。但是我想要以我不知道该怎么做的相反的方式
谁能帮我解决这个问题
Maven 仅从两个位置解析依赖项:
- 本地存储库(通常为
~/.m2/repository
(或 - 远程存储库,无论是公司内部还是像Maven Central这样的外部存储库。
(实际上,只有这两种类型的存储库。
[如果您正在使用 Eclipse,还有第三个选项,如果激活了相应的项目属性,则 M2Eclipse 插件可以在开发时解析工作区中的依赖关系。
因此,为了能够解析另一个项目中的依赖项,您必须至少对依赖项的项目执行以下操作一次:
-
mvn install
(到本地存储库(,如果需要,只需在本地计算机上 -
mvn deploy
(到远程存储库(,如果要与他人共享
要一步为所有项目执行此操作,您可以创建一个聚合器/多模块项目,例如:
+- aggregator
+- pom.xml
+- A
| +- pom.xml
+- B
| +- pom.xml
+- C
| +- pom.xml
+- ...
| +- pom.xml
...
其中聚合器的 POM 包含:
...
<packaging>pom</packaging>
<modules>
<module>A</module>
<module>B</module>
<module>C</module>
<module>...</module>
</modules>
...
并在此聚合器项目上执行mvn install
或mvn deploy
。
如果您不喜欢aggregator
项目引入的额外目录级别,您可以在同一级别上创建它,并在其 POM 中使用 <module>../A</module>
等。
而且,顺便说一句,<scope>compile
是默认值,因此您不必明确声明它。请记住:约定重于配置。;)
Maven说它找不到项目B的罐子。您需要先mvn install
项目 B。
如果这些是有凝聚力的(即它们实际上是一个构建(,那么将它们放入一个具有Maven多模块构建的构建中,然后以正确的顺序处理正确的事情。
如果它们真的都是独立的,那么,正如有人提到的,它们应该保存在一个中央存储库(例如 Nexus、Artifactory 等(中,并使用 CI(例如 Jenkins(构建,这可以确保您的本地构建始终找到其依赖项的构建副本。