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

37

有没有一种方法可以向我的POM添加一个pom类型的依赖项并获得它的所有模块?

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

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

想法:

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

相关:Netbeans:maven类型为pom的依赖项


注意:这里有一个很棒的教程:http://books.sonatype.com/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html - Andrejs
5个回答

67

你必须选择

<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>

该功能只是在依赖管理中简单地“包含”构件版本。因此,它不会向您的项目添加任何依赖关系。


7
请注意,虽然这个回答解决了大多数人来到这里的问题,但它并不是OP所问的内容。 - Nicola Ambrosetti
以上提供的解决方案都无法实现 OP 所需的功能:将 com.sun.mail:all:1.5.0 pom 中定义的所有模块(而非依赖项)导入到他自己的 pom 文件中。 - Murphy Ng
运行完美!需要添加类型和作用域标签才能使其正常工作! - Gaurav
在第一个例子中添加<type>pom</type>的目的是什么?即使没有它,所有传递依赖项也会被添加。 - Olivier Masseau

12

我相信你可以创建自己的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>

1
我经常这样做,而且非常有帮助。我还建议使用与JavaMail依赖项相同的版本号对邮件依赖项进行版本控制。例如,这使得明显的是mail-deps版本1.5.0包含了JavaMail 1.5.0的所有内容。 - Alex Oliveira

9
简短回答:在Maven中无法做到这一点。
其他答案只将“all” POM作为依赖项。这并不能解决问题。另一个答案尝试导入“all” POM的依赖项。我不需要依赖项,我需要“all” POM的(子)模块。同样,这也无法解决问题。
顺便说一下:我使用JavaMail库时有误。我只需要添加一个依赖项:com.sun.mail:javax.mail:1.5.0

1
由于Maven无法完全按照您的要求执行,因此创建一个“材料清单”工件已经成为常见做法,其唯一目的是声明依赖项及其版本。 - Thorbjørn Ravn Andersen

2

正如其他人已经写过的:你无法这样做。但这是我所做过的,并且它有效。假设你有一些pom文件(例如JavaMail),其中包含以下内容:

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

您希望将此pom文件中提到的所有jar包复制到某个地方。 以下是我所做的,这是一种快速有效的解决方案:
打开原始pom文件,将原始pom文件中的dependencies部分直接复制粘贴到您的新pom文件中。 当然,使用maven依赖插件来复制所有内容。


它与@Guillaume Darmont的答案有何不同? - Dexter

2
如果您要导入的pom文件中包含在<dependencies/>部分中定义的依赖项,并且您想要全部导入,可以尝试以下代码。
(免责声明:我已经有一段时间没有这样做了):在您的<dependencyManagement/>部分中添加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>

你可以直接在<dependencies/>部分定义依赖项,不需要使用<dependencyManagement/>,但据我所记,它应该被作用域import,如上所示。


这应该是正确的答案。在我的一个使用导入jdbi-libs的数据库库的项目中,它对我起作用了。使用您的解决方案,我不需要在我的主项目pom中引用所有jdbi libs,只需引用database-lib在<dependencyManagement>中即可。 - JackLeEmmerdeur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接