为什么Maven没有解析commons-configuration的所有依赖项?

Seb*_*ner 7 java maven apache-commons-config

摘要

XMLConfiguration configuration = new XMLConfiguration("config/config.xml");仅在尝试时commons-configuration 1.10我需要为我的maven设置添加更多依赖项(即commons-collections不比新项目更新3.2.1).为什么会这样,为什么maven不能简单地解决所有需要的依赖?

细节

我试图让commons-configuration工作.首先,我想使用最新版本2.0-alpha2,因为我无法配置Maven来下载正确的资源,所以它完全不能正常工作 - 但这是另一回事.

在我发现版本1.10实际上是"一点十"(而不是"一点一零")并且因此是最新版本的commons-configuration 1(并且由教程覆盖)之后,我决定试一试.

对于我的maven依赖项(集成在eclipse中)我用过:

<dependency>
    <groupId>commons-configuration</groupId>
    <artifactId>commons-configuration</artifactId>
    <version>1.10</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

但是,在尝试这个例子时:

package main;

import java.util.Iterator;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.XMLConfiguration;

public class ConfigurationTest {
    public static void main(String... args) {
        try {
            XMLConfiguration configuration = 
                    new XMLConfiguration("config/config.xml");
            Iterator<String> iterator = configuration.getKeys();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }
        } catch (ConfigurationException e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用以下config.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<configuration>
  <property>value</property>
  <nestedproperty>
    <arrayvalue>0,1,2,3,4</arrayvalue>
    <property>anothervalue</property>
  </nestedproperty>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我收到了错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/collections/CollectionUtils
    at org.apache.commons.configuration.XMLConfiguration.constructHierarchy(XMLConfiguration.java:640)
    at org.apache.commons.configuration.XMLConfiguration.initProperties(XMLConfiguration.java:596)
    at org.apache.commons.configuration.XMLConfiguration.load(XMLConfiguration.java:1009)
    at org.apache.commons.configuration.XMLConfiguration.load(XMLConfiguration.java:972)
    at org.apache.commons.configuration.XMLConfiguration$XMLFileConfigurationDelegate.load(XMLConfiguration.java:1647)
    at org.apache.commons.configuration.AbstractFileConfiguration.load(AbstractFileConfiguration.java:324)
    at org.apache.commons.configuration.AbstractFileConfiguration.load(AbstractFileConfiguration.java:261)
    at org.apache.commons.configuration.AbstractFileConfiguration.load(AbstractFileConfiguration.java:238)
    at org.apache.commons.configuration.AbstractHierarchicalFileConfiguration.load(AbstractHierarchicalFileConfiguration.java:184)
    at org.apache.commons.configuration.AbstractHierarchicalFileConfiguration.<init>(AbstractHierarchicalFileConfiguration.java:95)
    at org.apache.commons.configuration.XMLConfiguration.<init>(XMLConfiguration.java:261)
    at main.ConfigurationTest.main(ConfigurationTest.java:12)
Run Code Online (Sandbox Code Playgroud)

我首先希望他们(当然不是我)只是搞砸了一些maven依赖项,因为我不再费心去使用哪个版本(我没有让2.0工作,还记得吗?)我决定去版本1.9通过将maven依赖替换为:

<dependency>
    <groupId>commons-configuration</groupId>
    <artifactId>commons-configuration</artifactId>
    <version>1.9</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

这很好地解决了问题,测试用例正在运行:

property
nestedproperty.arrayvalue
nestedproperty.property
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试实现一个类似于非常简单的Apache-commons配置示例中引用的示例时,抛出NoClassDefFoundError及其后续问题我得到了完全相同的错误,但是解决方案,导入org.apache.commons.beanutils.PropertyUtils不能正常工作我错过了豆腐.所以基本上通过降级我只是从错过集合的错误切换到缺少beanutils.

有一个依赖项概述,您可以在其中查看执行操作时使用的依赖项.我有点惊讶地发现版本1.10现在使用了其他依赖项(即CollectionUtils),而不是构造函数调用中的1.9.由于在1.10和1.9中存在依赖性问题,我只是坚持使用新版本.

我发现CollectionUtils位于以下工件中(正如我在其maven存储库中指出的那样):

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

可悲的是,那个(一开始对我来说不明显)并没有CollectionUtils在包中定义类collections,而是在包中collections4.它在依赖性概述上暗示了这个问题,但他们只提到了早期版本可能存在的问题......我似乎已经不再考虑它了,只是简单地将依赖关系改为:

<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

在使用这些依赖项后,我得到了所有工作(或多或少,但我现在得到的异常不再取决于缺少的类定义):

<dependencies>
    <dependency>
        <groupId>commons-configuration</groupId>
        <artifactId>commons-configuration</artifactId>
        <version>1.10</version>
    </dependency>
    <dependency>
        <groupId>commons-collections</groupId>
        <artifactId>commons-collections</artifactId>
        <version>3.2.1</version>
    </dependency>
    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.9.2</version>
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

为什么我必须自己添加依赖项?我认为使用maven的重点是避免不得不做这些事情,就javadocs和源文件而言,它做得非常好.

到目前为止,我确信依赖关系不会被设计包含在层次结构中(是这样吗?),可能是为了避免开销.但是有没有办法可以简单地获取所有依赖项,甚至更好地获取我需要的所有依赖项?为什么这样设计呢?

Evg*_*eev 11

如果我们分析commons-configuration的POM,我们会看到commons-collections依赖项是可选的:

  <dependencies>
    <dependency>
      <groupId>commons-collections</groupId>
      <artifactId>commons-collections</artifactId>
      <version>3.2.1</version>
      <optional>true</optional>
    </dependency>
    ...
Run Code Online (Sandbox Code Playgroud)

此外,来自Maven文档:

如果用户想要使用与可选依赖项相关的功能,则必须在自己的项目中重新声明该可选依赖项.

  • 关于这个主题的进一步阅读可以在[这里](http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html)找到.该页面表明,可选的依赖项是解决方案,不将项目拆分为仅包含非可选依赖项的子模块.我想在这种情况下,如果您的用例不要求,配置人员不想强制使用大量的附加依赖项. (2认同)