Maven - 制作可以独立于父母的子项目

Dan*_*ana 29 maven-2

我有点像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 可用:

  • 设置一个公共maven存储库,将父pom部署到其中,并将存储库信息放入子pom中。
  • 您可以告诉 maven 在检查存储库之前在相对路径上查找父 pom(这可以在您对父 pom 进行本地更改但尚未部署时为您提供帮助)。因此,您可以想象在您的子项目中对您的父 pom 执行 svn:external 或等效操作。