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文档:
如果用户想要使用与可选依赖项相关的功能,则必须在自己的项目中重新声明该可选依赖项.
| 归档时间: |
|
| 查看次数: |
9825 次 |
| 最近记录: |