我有点像Maven newb,我正在尝试设置一个构建多个子项目的maven项目,但仍允许某人只需抓住其中一个子项目并在没有父项目的情况下独立构建它.
parentfolder
->pom.xml
->project1
->pom.xml
->src
->project2
->pom.xml
->src
->project3
->pom.xml
->src
Run Code Online (Sandbox Code Playgroud)
基本上我希望有人能够签出父文件夹并进行mvn编译以构建所有项目,并且还有人能够只签出project1并执行mvn编译来构建它.
我已经尝试将子项目声明为顶级pom.xml中的模块,
<modules>
<module>project1</module>
<module>project2</module>
<module>project3</module>
</modules>
Run Code Online (Sandbox Code Playgroud)
但这似乎要求在子代中声明父pom.xml信息.这使得子项目依赖于父pom.xml存在,这是我想要避免的.
Rom*_*las 57
您必须处理Maven2中父子关系和聚合概念之间的差异.它们的原理并不相同,即使它们实际上经常同时使用.
家长
第一个概念是项目在他pom.xml的父母中声明:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>foo</groupId>
<artifactId>bar</artifactId>
<version>42</version>
</parent>
...
Run Code Online (Sandbox Code Playgroud)
在这种情况下,为了构建此组件,必须在本地存储库中找到父项目.这是你的情况.
Maven 2中父概念的兴趣在于继承属性,依赖性,配置.在这里您将放置子项目的所有常见信息.
这与extendsJava语言完全相同.
聚合
在这种情况下,您有一个项目通过在module节点中指定它们的名称来聚合多个子模块:
<modules>
<module>commons</module>
<module>client</module>
<module>server</module>
...
</modules>
Run Code Online (Sandbox Code Playgroud)
这意味着您将在此根项目上运行的每个命令都将在每个模块上执行(该顺序由Maven 2 Reactor定义).例如,如果您mvn clean install在根项目上运行,Maven 2将在根项目上运行此命令,然后在项目上运行commons,然后运行client,最后运行server.
在这个概念中,您可以编译一个项目而无需编译任何其他项目(当然,除非存在相互依赖性).
这是一个显示两个不同概念的模式:
alt text http://books.sonatype.com/mvnref-book/reference/figs/web/pom_real_multi.png
你有在Maven这两个概念的更详细的解释:权威指南,在这里.
小智 0
父 pom 及其版本必须在子项中声明。
如果您的项目声明了父项目,则它必须在构建中可用(因此其中一个模块必须是父 pom),或者在存储库中可用。您似乎是在说您希望有人签出依赖于父级的项目,但无法访问父级,但仍然能够构建该项目,就像尝试构建一个没有依赖项的项目一样。
您可以选择使父 pom 可用: