【问题标题】:Maven: adding a reference to a parent pom projectMaven:添加对父 pom 项目的引用
【发布时间】:2013-10-24 03:04:30
【问题描述】:

我不确定我是否了解如何正确使用父 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

我的问题是我现在想在 不同 项目(不是 parent、child1 或 child2)中引用 parent 项目,从而拉入所有父母的孩子们。我可以在我的其他项目中添加对它的引用:

<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <type>pom</type>
    </dependency>
</dependencies>

执行此操作时,项目在 Eclipse 中没有显示任何错误,但没有将工件添加到我的类路径中:不是 child1、child2 或它们的任何依赖项。

我一直认为必须有一种方法来拥有一个“主”pom 项目,它本身不是一个 jar,但只引用其他 jar,然后能够在某处引用该“主”,但我找不到了解这是如何实现的。

【问题讨论】:

    标签: java eclipse maven m2eclipse


    【解决方案1】:

    尝试创建一个具有相同包装类型的超级 pom 并将您当前的父级添加为依赖项。

    【讨论】:

      【解决方案2】:

      我建议的第一件事是改变你的项目结构。

      --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 中,您可以(并且应该)固定不同的插件版本,并使用适当的版本定义公司默认值和依赖项建议。

      如果你喜欢拥有一个公司 super-pom,你只需创建一个单独的 maven 项目,它只包含 pom 文件,其中包含你的配置,如插件、依赖项等,当然还可以将其检入版本控制(Git、SVN 等) .与其他项目分开。

      如果你想引用一个 jar 文件,也就是说你的多模块构建的工件,你必须使用正确的 groupId、artifactId 和版本。如果您想在其他项目中使用 child1,您需要提供以下信息:

      <dependencies>
          <dependency>
              <groupId>com.example</groupId>
              <artifactId>child1</artifactId>
              <version>0.0.1-SNAPSHOT</version>
          </dependency>
      </dependencies>
      

      重要的是要了解多模块构建的父级不是通常使用的工件,因为基于包装类型pom 它并没有真正创建工件(jar 文件)。

      更新: 您可以通过scope import 仅针对dependencyManagement 区域以有限的方式执行此操作,但这仅适用于depdencyManagement,不适用于依赖项。 另一种解决方案可能是创建一个单独的虚拟项目,该项目具有两个子项作为传递依赖项的依赖项。但这并不是真正的美。

      所以解决方案就是直接添加您在项目中使用的两个或多个依赖项,仅此而已。

      【讨论】:

      • 你的最后两段让我觉得我不明白如何使用父 pom。尽管我使用了在其中的所有子模块之间共享的公共依赖项,但我真的想要一个可以添加到其他项目中的单个依赖项,这些项目将引入独立但相关的“子模块”。我想添加一个将同时引入 child1child2 的依赖项。
      • @trebor Parent POM 不是为了那个。要创建元项目,请创建一个名为 common-libraries 的常规 Maven 项目,并将所有其他项目作为依赖项引用。父POM是一步构建多个库,并自动使用正确的构建顺序。
      【解决方案3】:

      正如@khmarbaise 指出的那样,多模块构建的父级通常不用作其他地方的依赖项。

      您应该能够将每个子模块添加为依赖项,并通过添加父 pom.xml 来实现您想要做的事情。

      【讨论】:

      • 这就是我试图通过父 pom 实现的...我想要一个可以添加的单个依赖项,它将引入其他相关但不依赖的工件。意思是,我希望 child1child2 在一个单独的项目中,但不想将两者都定义为依赖项。
      • 听起来我试图定义一种在 Maven 中不存在的包含文件。您使用的每个依赖项都应该明确声明。另一方面,dependencyManagement 部分的目的是定义依赖关系及其版本,以作为建议在更大的组织中使用。但是如果你真的喜欢使用依赖项,你必须将它写入项目的 pom 中(版本除外)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 2013-06-12
      • 2016-07-20
      • 2013-02-04
      • 2023-03-05
      • 2023-03-08
      相关资源
      最近更新 更多