【问题标题】:Maven - making child projects that can be independent of their parentMaven - 制作可以独立于父项目的子项目
【发布时间】:2010-12-16 02:01:01
【问题描述】:

我是一个 Maven 新手,我正在尝试设置一个构建多个子项目的 maven 项目,但仍然允许有人只抓取其中一个子项目并在没有父项目的情况下独立构建它。

parentfolder
  ->pom.xml
  ->project1
    ->pom.xml
    ->src
  ->project2
    ->pom.xml
    ->src
  ->project3
    ->pom.xml
    ->src

基本上我希望有人能够检出父文件夹并执行 mvn compile 来构建所有项目,并且还希望有人能够检出 project1 并执行 mvn compile 来构建它。

我尝试在顶级 pom.xml 中将子项目声明为模块,

<modules>
  <module>project1</module>
  <module>project2</module>
  <module>project3</module>
</modules>

但这似乎需要在子级中声明父 pom.xml 信息。这使得子项目依赖于存在的父 pom.xml,这是我想要避免的。

【问题讨论】:

    标签: maven-2


    【解决方案1】:

    您必须注意Maven2中父子关系和聚合概念之间的差异。它们不是同一个原理,即使它们确实经常同时使用。

    家长

    第一个概念是一个项目在他的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 上运行,最后在server 上运行。

    在这个概念中,您可以编译一个项目而无需编译任何其他项目(当然,除非存在相互依赖关系)。

    这是一个显示两个不同概念的架构:

    您在 Maven 中对这两个概念有更详细的解释:权威指南,here

    【讨论】:

      【解决方案2】:

      子项目仅在使用 标签(maven 继承)时才依赖于父项目。您不需要在子模块中使用 标记。但是,如果您希望您的模块从父 pom 继承公共元素,那么您必须使用 maven 继承。

      严格来说,如果您正在使用继承并且只想构建一个子项目,那么父 pom.xml 不必存在于父目录中;只要 maven 可以在本地或远程存储库中找到父 pom,那么它就会构建。在实践中,如果您的父 pom 发生变化,您必须弄清楚如何让您的团队成员与父 pom 保持同步。

      【讨论】:

      • 你的意思是,如果你只想构建子模块而不继承任何父pom定义,你不必在子pom中使用标签吗?跨度>
      • 谁知道呢,那是 7 年前我回答这个问题的时候;)
      【解决方案3】:

      必须在子级中声明父级 pom 及其版本。

      如果您的项目声明了父项,则它必须在构建中可用,因此其中一个模块必须是父 pom,或者在存储库中。您似乎是在说您希望某人签出依赖于父级的项目,但无法访问父级并且仍然能够构建该项目,这就像尝试构建一个没有其依赖项的项目一样。

      您可以选择使父 pom 可用:

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

      【讨论】:

        【解决方案4】:

        在我看来,问题在于 Maven 正在重载父标签。 Maven 文档一直告诉我继承和聚合是两个不同的东西,但它们都使用相同的标签来实现它们的功能。这确实不利于原始发帖人所要求的情况。一个人可能想要

        1. 从共同的父级继承某些设置,但
        2. 有两个不同应用程序的构建共享一个公共组件。

        因此我们这里对父级关系有两种不同的理解。首先,为每个模块提供设置的“父级”,第二个,构建子级的“父级”。由于后者有两个,因此它会崩溃。这两种出身观念相互影响。

        【讨论】:

          【解决方案5】:

          这个问题可以通过使用maven的Project Aggregation而不是Project Inheritance来解决。

          【讨论】:

            猜你喜欢
            • 2018-10-02
            • 2020-10-23
            • 2017-02-08
            • 1970-01-01
            • 2013-06-19
            • 2021-09-08
            • 2010-12-10
            • 2019-02-11
            • 2012-05-26
            相关资源
            最近更新 更多