我有点像Maven newb,我正在尝试设置一个构建多个子项目的maven项目,但仍允许某人只需抓住其中一个子项目并在没有父项目的情况下独立构建它。 / p>
parentfolder
->pom.xml
->project1
->pom.xml
->src
->project2
->pom.xml
->src
->project3
->pom.xml
->src
基本上我希望有人能够检查父文件夹并进行mvn编译以构建所有项目,并且还有人能够只检查project1并执行mvn编译以构建它。
我已经尝试将子项目声明为顶层pom.xml中的模块,
<modules>
<module>project1</module>
<module>project2</module>
<module>project3</module>
</modules>
但这似乎要求在子代中声明父pom.xml信息。这使得子项目依赖于父pom.xml,这是我想要避免的。
答案 0 :(得分:55)
您必须注意Maven2中父子关系和聚合概念之间的差异。它们的原理并不相同,即使它们经常同时使用。
<强> PARENT 强>
第一个概念是项目在他的pom.xml
父母中声明:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>foo</groupId>
<artifactId>bar</artifactId>
<version>42</version>
</parent>
...
在这种情况下,为了构建此组件,必须在本地存储库中找到父项目。这就是你的情况。
Maven 2中父概念的兴趣在于继承属性,依赖性,配置。在这里您可以放置儿童项目的所有常用信息。
这与Java语言中的extends
完全相同。
<强>聚集强>
在这种情况下,您有一个项目通过在module
个节点中指定其名称来聚合多个子模块:
<modules>
<module>commons</module>
<module>client</module>
<module>server</module>
...
</modules>
这意味着您将在此根项目上运行的每个命令都将在每个模块上执行(该顺序由Maven 2 Reactor定义)。例如,如果您在根项目上运行mvn clean install
,Maven 2将在根项目上运行此命令,然后在项目commons
上运行,然后在client
上运行,最后在{{1}上运行}。
在这个概念中,您可以编译一个项目而无需编译任何其他项目(当然,除非存在相互依赖性)。
这是一个显示两个不同概念的模式:
您对Maven:The Definitive Guide,here中的这两个概念有更详细的解释。
答案 1 :(得分:1)
如果子项目使用&lt; parent&gt;,则子项目仅依赖于父项目。标签(maven继承)。您无需使用&lt; parent&gt;子模块中的标记。但是,如果您希望模块从父pom继承公共元素,则必须使用maven继承。
严格地说,如果 使用继承并且只想构建子项目,那么父pom.xml不必存在于父目录中;只要maven可以在本地或远程存储库中找到父pom,它就会构建。在实践中,如果您的父pom中发生了变化,您将需要弄清楚如何让您的团队成员跟上父pom的最新信息。
答案 2 :(得分:0)
必须在孩子们中声明父pom及其版本。
如果您的项目声明了父项,那么它必须在构建中可用,因此其中一个模块必须是父pom,或者在存储库中。你好像在说你希望有人签出一个依赖于父级的项目,但是没有父级的访问权限,仍然可以构建项目,就像尝试构建没有依赖项的项目一样。
您可以选择使用父pom:
答案 3 :(得分:0)
在我看来,问题是Maven正在重载父标记。 Maven文档一直告诉我,继承和聚合是两个不同的东西,但它们都使用相同的标记来实现它们的功能。这确实不利于原始海报所要求的情景。人们可能想要
因此,我们对父母关系有两种不同的理解。首先,“父”为每个模块提供设置,其次是构建子项的“父”。由于后者有两个,因此会崩溃。父母的两种观念相互促进。
答案 4 :(得分:0)
使用maven的Project Aggregation代替Project Inheritance可以解决此问题。