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

时间:2013-06-03 09:51:30

标签: java maven dependencies pom.xml

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

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

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

思路:

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

5 个答案:

答案 0 :(得分:49)

你必须使用

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

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

答案 1 :(得分:8)

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

答案 2 :(得分:3)

简短回答:你不能在Maven中这样做。

其他答案只使“全部”POM成为依赖。没有解决问题。另一个答案是尝试导入“所有”POM的依赖关系。我不需要依赖;我需要“全部”POM的(子)模块。再次,并没有解决问题。

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

答案 3 :(得分:1)

如果您尝试导入的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如上所示。

答案 4 :(得分:1)

如上所述:您无法做到。但这就是我所做的并且有效。 让我们假设您有一些pom文件(在您的示例中为JavaMail),其中包含以下内容:

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

你想把这个pom中提到的所有罐子都复制到某个地方。 这就是我所做的,它是快速工作的解决方案
打开原始pom,只需将原始pom文件中的所有依赖项部分复制粘贴到新的pom中。 当然使用maven依赖插件来复制所有。