gpt4 book ai didi

java - 为什么 Maven 不解决公共(public)配置的所有依赖项?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:07:04 25 4
gpt4 key购买 nike

总结

当尝试 XMLConfiguration configuration = new XMLConfiguration("config/config.xml"); 只有 commons-configuration 1.10 我需要添加更多依赖项(即 commons-collections 不比 3.2.1 更新)到我的 Maven 设置。为什么会这样,为什么 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 工作,记得吗?)我决定去通过将 Maven 依赖项替换为 1.9 版:

<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>1.9</version>
</dependency>

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

property
nestedproperty.arrayvalue
nestedproperty.property

但是当我尝试实现与 Very simple Apache-commons configuration example throws NoClassDefFoundError 中引用的示例类似的示例时及其后续问题我得到了与那里引用的完全相同的错误 - 但是导入 org.apache.commons.beanutils.PropertyUtils 的解决方案不起作用,因为我缺少 beanutils。所以基本上通过降级,我只是从缺少集合的错误切换到缺少 beanutils。

有一个dependency overview当你做什么时,你可以在哪里看到使用了哪些依赖项。我有点惊讶地得知 1.10 版现在使用了其他依赖项(即 CollectionUtils),而不是 1.9 版在构造函数调用中使用的依赖项。由于 1.10 和 1.9 中存在依赖性问题,我只是坚持使用较新的版本。

我在以下 Artifact 中找到了 CollectionUtils(我被它的 maven repository 指向那里):

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>

可悲的是,那个(一开始对我来说并不明显)没有在包 collections 中定义类 CollectionUtils,而是在包 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 的全部意义在于避免必须执行此类操作,并且就 javadoc 和源文件而言,它做得非常好。

到现在为止,我确信依赖项在设计上没有包含在层次结构中(是这样吗?),可能是为了避免开销。但是,有没有一种方法可以简单地一次获取所有依赖项,或者更好地获取我需要的所有依赖项?为什么要这样设计?

最佳答案

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

  <dependencies>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
<optional>true</optional>
</dependency>
...

此外,来自 Maven 文档:

If a user wants to use functionality related to an optional dependency, they will have to redeclare that optional dependency in their own project.

关于java - 为什么 Maven 不解决公共(public)配置的所有依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28692844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com