如何在Maven中使用单个groupId与多个artifactId?

5

第一个依赖项是验证 XML 文件。

<dependency>
 <groupId>xerces</groupId>
 <artifactId>xerces</artifactId>
 <version>2.4.0</version>
</dependency>

第二个依赖是将POI对象写入文件。

<dependency>
 <groupId>xerces</groupId>
 <artifactId>xercesImpl</artifactId>
 <version>2.12.0</version>
</dependency>

现在,我需要一个类似以下的解决方案:
<dependency>
 <groupId>xerces</groupId>
 <artifactId>xerces</artifactId> 
 <artifactId>xercesImpl</artifactId>
 <version>2.12.0</version>
</dependency>

这是否可能实现?


2
无法使用您的想法进行工作。这违反了XML模式定义。 - PatrickChen
2
你说的“使用”是什么意思?你可以只指定多个依赖项;groupId不必唯一。 - chrylis -cautiouslyoptimistic-
3个回答

2
在单个dependency标签中保留多个artifactId标签是不可能的。Maven的XML模式定义将无法验证它。它会产生以下错误:
Project build error: Non-parseable POM project/pom.xml: Duplicated tag: 'artifactId' (position: START_TAG seen ...</artifactId>\n 

例如:

举个例子:

这是正确的。

<dependency>
 <groupId>xerces</groupId>
 <artifactId>xercesImpl</artifactId>
 <version>2.12.0</version>
</dependency>

这是错误的。
<dependency>
 <groupId>xerces</groupId>
 <artifactId>xerces</artifactId>
 <artifactId>xercesImpl</artifactId>
 <version>2.12.0</version>
</dependency>

您可以像这样使用,因为artifactId不同(没有任何问题):
    <dependency>
        <groupId>xerces</groupId>
        <artifactId>xerces</artifactId>
        <version>2.4.0</version>
    </dependency>

    <dependency>
        <groupId>xerces</groupId>
        <artifactId>xercesImpl</artifactId>
        <version>2.12.0</version>
    </dependency>

你可以参考这个链接:Maven中同一依赖的多个版本 注意: JDK 8已经提供了SAX解析器来验证XML。请使用它,你不需要第三方jar包来验证XML。
在这里阅读有关Java SAX解析器的内容:这里

1
谢谢Anish的回复,问题是第一个依赖项用于验证XML文件,第二个依赖项用于编写Apache POI文件。我需要在单个项目中实现两者。 - user12639212
1
Maven中同一依赖项的多个版本<<此链接artifactId id相同,在我的情况下,artifactId是不同的。 - user12639212
包org.xml.sax可以从多个模块访问:<未命名>,java.xml这是一个问题。 - user12639212
1
好的,这不是关于Maven依赖项,而是Java模块? - J Fabian Meier
@DileepBalineni 你是否在使用Java 8?如果是,那么Java 8已经包含了SAX解析器。使用它就可以了,不需要第三方程序来验证XML。阅读这篇文章:https://www.tutorialspoint.com/java_xml/java_sax_parser.htm - Anish B.
显示剩余2条评论

0

我可以看到两个可能会让你担心并且可能是你需要的来源的问题。

  1. 过度臃肿的 POM 文件,有点类似
  2. 如果 groupId 更改,可维护性。

如果您关心 POM 文件的长度和可读性,您可以尝试一些 Maven 扩展,例如 maven polyglot(已经提到),或者其他一些扩展,您可以使用“thinXML格式”编写 POM。

如果您关心可维护性,那么您可以在属性中定义 groupId 并使用 maven 的内置 ${} 语法引用它。


0

Maven POM模式不允许您在单个声明中声明同一组的多个工件。说实话,我没有看到有什么强烈的动机这样做,原因如下:

  1. 一旦设置好POM,您就不会经常更改它。

  2. 有些情况下,同一组的工件版本也会有所不同。 Maven通过假设版本总是不同来保持解析简单。缺点是您必须复制一些行,但并不是很大的问题。

  3. 您很少有那么多同一组的工件来证明这一点。 Spring可能是其中之一,但他们提供了一个材料清单(BoM),已经完成了大部分繁重的工作。

注意1:如果您正在寻找更紧凑的构建版本,则可以查看Maven Polyglot,它允许您拥有更紧凑的构建文件,同时仍然使用Maven。

注 2:一个替代 Maven 的选择是 Gradle,它允许像那样做。由于其命令式本质,你可以直接写代码。但要注意,从 Maven 切换到 Gradle 是一个巨大的飞跃,不仅是一些脚本的翻译。两个工具都有它们的优势和应该仔细考虑。


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