【问题标题】:How to use POMs as a dependency in Maven?如何在 Maven 中使用 POM 作为依赖项?
【发布时间】: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

【问题讨论】:

标签: java maven dependencies pom.xml


【解决方案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; 中的数据库库即可。
猜你喜欢
  • 2017-02-23
  • 2011-08-30
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
相关资源
最近更新 更多