15

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

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

<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,然后能够在某处引用该“主”,但我不知道这是怎么回事完成。

4

3 回答 3

15

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

--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 和版本。如果您想在其他项目中使用 child1,您需要提供以下内容:

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

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

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

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

于 2013-10-16T06:08:59.160 回答
0

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

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

于 2013-10-16T07:26:56.223 回答
0

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

于 2013-10-16T05:54:21.433 回答