我有两个Maven Java项目(比如说Project A和Project B)。由于项目A需要项目B的某些服务,因此我已将项目B 作为依赖项放置在项目A 中。我确实喜欢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
,一切都会正常。但是我想要相反的方式,我不知道该怎么做
有人可以帮我吗
答案 0 :(得分:1)
Maven表示无法找到projectB的jar。您需要先mvn install
个projectB。
如果这些内容具有凝聚力(即它们实际上是一个内部版本),则将其与Maven multi-module build放在一个内部版本中,然后将按照正确的顺序进行正确的操作。
如果它们确实是完全分开的,那么就像有人提到的那样,应将它们保存在中央存储库(例如Nexus,Artifactory等)中,并使用CI(例如Jenkins)进行构建,以确保您的本地构建始终可以找到构建的副本它的依赖性。
答案 1 :(得分:1)
Maven仅从两个位置解析依赖项:
~/.m2/repository
中)或(实际上是there are just these two types of repositories。)
[如果您使用的是Eclipse,则有第三种选择,其中M2Eclipse plugin可以在开发相应项目属性的情况下在开发过程中解决工作空间中的依赖关系。]
因此,要能够解决另一个项目中的依赖项,您必须对依赖项的项目至少执行一次以下操作:
mvn install
(到本地存储库)(如果仅在本地计算机上需要的话)mvn deploy
(到远程仓库)(如果要与他人共享)要一步一步对所有项目执行此操作,可以创建一个aggregator / multi-module项目,例如:
+- 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
是默认设置,因此您不必显式声明它。请记住:Convention over configuration。 ;)