问题 Maven:添加对父pom项目的引用


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

我的问题是我现在要参考  项目在 不同 项目(不是父项,子项1或子项2),因此拉入所有父项的子项。我可以在我的其他项目中添加对它的引用:

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

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

我一直认为必须有一种方法来拥有一个“主”pom项目,它本身不是一个罐子,但只引用其他罐子,然后能够在某处引用那个“主”,但我无法知道这是怎么回事完成了。


8993
2017-10-16 05:37


起源



答案:


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

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

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

如果你想引用一个jar文件,换句话说就是你的多模块构建的工件,你必须使用正确的groupId,artifactId和version。如果您想在其他项目中使用child1,您需要提供以下内容:

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

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

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

因此,解决方案只是直接添加您在项目中使用的两个或更多依赖项,就是这样。


11
2017-10-16 06:08



你的最后两段让我觉得我不明白我如何使用父pom。虽然我使用在其中的所有子模块共享的公共依赖项,但我真的想要一个可以添加到其他项目的依赖项,这些项目将引入独立但相关的“子项”。我想添加一个将同时引入的依赖项 child1 和 的child2。 - trebor
@trebor父POM不是为了这个。要创建元项目,请创建一个名为的常规Maven项目 common-libraries 并将所有其他项目作为依赖项引用。父POM是一步构建多个库,并自动使用正确的构建顺序。 - Aleksandr Dubinsky


答案:


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

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

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

如果你想引用一个jar文件,换句话说就是你的多模块构建的工件,你必须使用正确的groupId,artifactId和version。如果您想在其他项目中使用child1,您需要提供以下内容:

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

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

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

因此,解决方案只是直接添加您在项目中使用的两个或更多依赖项,就是这样。


11
2017-10-16 06:08



你的最后两段让我觉得我不明白我如何使用父pom。虽然我使用在其中的所有子模块共享的公共依赖项,但我真的想要一个可以添加到其他项目的依赖项,这些项目将引入独立但相关的“子项”。我想添加一个将同时引入的依赖项 child1 和 的child2。 - trebor
@trebor父POM不是为了这个。要创建元项目,请创建一个名为的常规Maven项目 common-libraries 并将所有其他项目作为依赖项引用。父POM是一步构建多个库,并自动使用正确的构建顺序。 - Aleksandr Dubinsky


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


0
2017-10-16 05:54





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

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


0
2017-10-16 07:26



这就是我正在尝试用父pom实现的...我想要一个我可以添加的依赖,它会引入其他相关但不相关的工件。意思是,我想要两个 child1 和 的child2 在一个单独的项目中,但不希望将两者都定义为依赖项。 - trebor
听起来我试图定义一种Maven中不存在的包含文件。您使用的每个依赖项都应声明为显式。另一方面,dependencyManagement部分有意定义其版本的依赖关系作为建议在大型组织中使用。但是,如果您真的想使用依赖项,则必须将其写入项目的pom(版本除外)。 - khmarbaise