如何在 Maven 中使用 POM 作为依赖项?

Posted

技术标签:

【中文标题】如何在 Maven 中使用 POM 作为依赖项?【英文标题】:How to use POMs as a dependency in Maven? 【发布时间】:2013-05-29 10:39:31 【问题描述】:

有没有办法向我的 POM 添加 pom 类型依赖项并获取它的所有模块?

JavaMail 就是一个很好的例子。 Maven Central Repo 有一个名为:com.sun.mail:all:1.5.0 的父 POM,其中包含以下模块:mail、mailapi、mailapijar、smtp、imap、gimap、pop3 和 dsn。

但是,“所有”工件只有一个文件:pom.xml 有没有办法将此“所有”工件作为依赖项添加到我的 POM 并获取其所有模块?我 90% 确定这不是在 Maven 中使用依赖项的正确方法,但我想听听 The Stack 专家的意见。

想法:

<dependencies><dependency>...<type>pom</type></dependency></dependencies> <dependencyManagement><dependencies><dependency>...<type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

相关:Netbeans: maven dependencies of type pom

【问题讨论】:

注意:这里有一个很棒的 tut:books.sonatype.com/mvnref-book/reference/… 【参考方案1】:

你必须去

<dependencies>
  <dependency>
     <groupId>com.my</groupId>
     <artifactId>commons-deps</artifactId>
     <type>pom</type>
  </dependency>
</dependencies>

这会将com.my:commons-deps 中声明的所有依赖项传递到您当前的 POM。

使用

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>...</groupId>
            <artifactId>...</artifactId>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

在您的依赖管理中作为工件版本的简单“包含”。因此,它不会在您的项目中添加任何依赖项。

【讨论】:

请注意,虽然这回答了大多数人最有可能导致他们来到这里的问题,但这并不是 OP 真正提出的问题。 以上提供的解决方案都无法实现 OP 想要的:将 com.sun.mail:all:1.5.0 pom 中定义的所有模块(不是依赖项)导入到他自己的 pom 文件中 完美运行!需要同时添加类型和范围标签才能使其工作!【参考方案2】:

我相信您可以创建自己的 POM 来聚合所需的依赖项,然后在您的原始项目中添加对该聚合 pom 的依赖项。您仍然需要在依赖项 POM 中的每个单独模块上添加依赖项,但它将从实际项目 POM 中抽象出来,并允许在一个地方管理这些依赖项,如果您最终拥有多个依赖的项目,这可能会变得有用在那组依赖关系上。

在您的示例中,您可以像这样创建一个新的 pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                             http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mycompany</groupId>
    <artifactId>mail-deps</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

    <dependencies>
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.5.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>mailapi</artifactId>
            <version>1.5.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>mailapijar</artifactId>
            <version>1.5.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>imap</artifactId>
            <version>1.5.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>gimap</artifactId>
            <version>1.5.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>pop3</artifactId>
            <version>1.5.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>dsn</artifactId>
            <version>1.5.0</version>
        </dependency>
    </dependencies>
</project>

然后在您的原始项目中添加:

<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                         http://maven.apache.org/maven-v4_0_0.xsd">
 ...
 <modules>
   <module>src/main/java/com/mycompany</module>
 </modules>
 ...
 <dependencies>
     <dependency>
         <groupId>com.mycompany</groupId>
         <artifactId>mail-deps</artifactId>
         <version>1.0.0</version>
         <type>pom</type>
     </dependency>
 </dependencies>
</project>

【讨论】:

我一直这样做,这真的很有帮助。我还建议使用相同数量的 JavaMail 依赖项对您的邮件依赖项进行版本控制。这表明 mail-deps 版本 1.5.0 包括 JavaMail 1.5.0 中的所有内容。【参考方案3】:

简短的回答:您不能在 Maven 中执行此操作。

其他答案仅使“所有” POM 成为依赖项。不能解决问题。另一个答案尝试导入“所有”POM 的依赖项。我不需要依赖项;我需要“所有”POM 的(子)模块。再次,不能解决问题。

旁注:我错误地使用了 JavaMail 库。我只需要添加一个依赖:com.sun.mail:javax.mail:1.5.0

【讨论】:

由于您无法完全按照您在 Maven 中的要求执行操作,因此创建“物料清单”工件已变得很常见,其唯一目的是声明依赖项及其版本。【参考方案4】:

正如上面已经有人写的:你不能这样做。但这就是我所做的,并且奏效了。 假设您有一些 pom 文件(在您的示例中为 JavaMail),其中包含以下内容:

<type>pom</type>
<dependencyManagement><dependencies><dependency></dependencyManagement>

并且您想将这个 pom 中提到的所有 jar 复制到某个地方。 这就是我所做的,它是快速工作的解决方案 打开原始 pom 并按原样将原始 pom 文件中的所有 dependencies 部分复制粘贴到您的新 pom 中。 当然使用maven依赖插件复制所有。

【讨论】:

与@Guillaume Darmont 的回答有何不同?【参考方案5】:

如果您尝试导入的 pom 包含在 &lt;dependencies/&gt; 部分中定义的依赖项,并且您希望将它们全部导入,您可以尝试以下代码。

免责声明:我已经有一段时间没有这样做了):在您的 &lt;dependencyManagement/&gt; 部分中,像这样添加 pom 依赖项:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>kung.fu<groupId>
            <artifactId>ninja</artifactId>
            <version>1.2.3</version>
            <scope>import</scope>
            <type>pom</type> <!-- Not too sure if you needed this
                                  when it's scoped as import,
                                  but just in case -->
        </dependency>
    </dependencies>
</dependencyManagement>

也可能是您直接在 &lt;dependencies/&gt; 部分中定义依赖项而不需要 &lt;dependencyManagement/&gt; 位,但据我记得,它应该在import 范围内,如上所示。

【讨论】:

这应该是正确的答案。它在一个带有导入 jdbi-libs 的数据库库的项目中对我有用。使用您的解决方案,我不需要主项目 pom 中的所有 jdbi 库,只需引用 &lt;dependencyManagement&gt; 中的数据库库即可。

以上是关于如何在 Maven 中使用 POM 作为依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

带有 Gradle 的 POM 中缺少 Android 库依赖项

如何在 Maven 依赖项 pom.xml 文件中添加其他参数

如何在 Maven 中找出隐藏的依赖项和插件版本?

如何将本地项目(不是 jar)作为依赖项添加到 Maven 项目

如何配置 Eclipse 构建路径以使用 Maven 依赖项?

如何在 pom.xml 中添加\安装到新创建\第三方 jar 的 maven 依赖项