如何在 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 包含在 <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 库,只需引用<dependencyManagement>
中的数据库库即可。以上是关于如何在 Maven 中使用 POM 作为依赖项?的主要内容,如果未能解决你的问题,请参考以下文章
带有 Gradle 的 POM 中缺少 Android 库依赖项
如何在 Maven 依赖项 pom.xml 文件中添加其他参数
如何将本地项目(不是 jar)作为依赖项添加到 Maven 项目