概括
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>
但是,在尝试此示例时:
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();
}
}
}
使用以下 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>
我得到了错误:
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)
我首先希望他们(当然不是我)只是搞砸了一些 maven 依赖项,因为我不会再打扰使用哪个版本了(我没有让 2.0 工作,记得吗?)我决定降级到版本1.9 通过将 maven 依赖项替换为:
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>1.9</version>
</dependency>
这很好地解决了问题,测试用例正在运行:
property
nestedproperty.arrayvalue
nestedproperty.property
但是,当我尝试实现与非常简单的 Apache-commons 配置示例中引用的示例类似的示例时,抛出 NoClassDefFoundError及其后续问题时,我得到了在那里引用的完全相同的错误 - 但解决方案,导入org.apache.commons.beanutils.PropertyUtils
不起作用,因为我我想念beanutils。所以基本上通过降级,我只是从缺少集合的错误切换到缺少 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>
可悲的是,一个(一开始对我来说并不明显)没有在 package 中定义类CollectionUtils
,collections
而是在 package 中collections4
。在依赖项概述中暗示了这个问题,但他们只提到了早期版本可能存在的问题......我似乎不再考虑它了,而是简单地将依赖项更改为:
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
使用这些依赖项后,我得到了一切工作(或多或少,但我现在得到的异常不再取决于缺少的类定义):
<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>
为什么我必须自己添加依赖项?我认为使用 maven 的重点是避免必须做这些事情,并且就 javadocs 和源文件而言,它做得很好。
到目前为止,我确信依赖项不包含在设计层次结构中(是这样吗?),可能是为了避免开销。但是,有没有办法一次简单地获取所有依赖项,或者更好地获取我需要的所有依赖项?为什么要这样设计?