我不确定我是否理解如何正确使用父pom项目。我定义了以下父pom:
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>../child1</module>
<module>../child2</module>
</modules>
然后,子pom引用父项(每个子项都有自己的一组依赖项,但未显示):
<parent>
<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../Parent/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>child1</artifactId>
此设置工作正常,并在eclipse(m2eclipse)中正确解析。我可以将这些部署到我的本地存储库,最终得到以下结构,这应该是正确的:
--com
--example
--parent
--0.0.1-SNAPSHOT
--parent-0.0.1-SNAPSHOT.pom
--child1
--0.0.1-SNAPSHOT
--child1-0.0.1-SNAPSHOT.jar
--child1-0.0.1-SNAPSHOT.pom
--child2
--0.0.1-SNAPSHOT
--child2-0.0.1-SNAPSHOT.jar
--child2-0.0.1-SNAPSHOT.pom
我的问题是,我现在想要在不同的项目中引用父项目(而不是父项,子项1或子项2),从而拉入所有父项儿童。我可以在我的其他项目中添加对它的引用:
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>pom</type>
</dependency>
</dependencies>
执行此操作时,项目在eclipse中没有显示任何错误,但没有向我的类路径添加工件:not child1,child2或其任何依赖项。
我一直认为必须有一种方法可以拥有一个“主”pom项目,它本身不是一个罐子,但只引用其他罐子,然后能够在某个地方引用那个“主人”,但我找不到如何实现这一目标。
答案 0 :(得分:14)
我建议改变你的项目结构。
--com
--example
--parent
--0.0.1-SNAPSHOT
--parent-0.0.1-SNAPSHOT.pom
--child1
--0.0.1-SNAPSHOT
--child1-0.0.1-SNAPSHOT.jar
--child1-0.0.1-SNAPSHOT.pom
--child2
--0.0.1-SNAPSHOT
--child2-0.0.1-SNAPSHOT.jar
--child2-0.0.1-SNAPSHOT.pom
我建议采用以下方式:
--parent (pom.xml)
+--child1
+--child2
父级可以在版本控制(Git,SVN)中签入主服务器或中继服务器。除此之外,所有孩子都必须像这样引用父母:
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>child1</artifactId>
在你的父母那里你可以使用这样的东西:
<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>child1</module>
<module>child2</module>
</modules>
此外,只需向项目父级添加父引用即可使用公司pom:
<parent>
<groupId>com.example</groupId>
<artifactId>master-pom</artifactId>
<version>0.0.1</version>
</parent>
<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>child1</module>
<module>child2</module>
</modules>
在公司pom中,您可以(并且应该)固定不同的插件版本,并使用适当的版本定义公司默认值和依赖关系建议。
如果您喜欢公司的超级pom,您可以简单地创建一个单独的maven项目,该项目仅包含pom文件,其中包含插件,依赖项等配置,当然还要将其检入版本控制(Git,SVN等) 。与其他项目分开。
如果你想引用一个jar文件,换句话说就是多模块构建的工件,你必须使用正确的groupId,artifactId和version。如果您想在其他项目中使用child1,您需要提供以下内容:
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>child1</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
重要的是要理解多模块构建的父级不是通常使用的工件,因为基于打包类型pom
它不会真正创建工件(jar文件)。 / p>
<强>更新强>
您只能以限制的方式对scope import
的dependencyManagement区域执行此操作,但这仅适用于depdencyManagement而不是依赖项。
另一种解决方案可能是创建一个单独的虚拟项目,该项目具有两个子项作为传递deps的依赖项。但这不是真正的美丽。
因此,解决方案只是直接添加您在项目中使用的两个或更多依赖项,就是这样。
答案 1 :(得分:0)
尝试创建具有相同打包类型的超级pom,并将当前父级添加为依赖项。
答案 2 :(得分:0)
正如@khmarbaise指出的那样,多模块构建的父级通常不会在其他地方用作依赖项。
您应该能够将每个子模块添加为依赖项,并通过添加父pom来实现您想要做的事情。