Почему Maven не разрешает все зависимости для commons-configuration?
резюме
при попытке XMLConfiguration configuration = new XMLConfiguration("config/config.xml");
С commons-configuration 1.10
мне нужно добавить больше depencies (а именно commons-collections
не новее, чем 3.2.1
) к моей настройке maven. Почему это так и почему maven просто не разрешает все необходимые зависимости?
подробности
я пытаюсь получить Коммонс-конфигурация на работу. Сначала я хотел использовать последнюю версию 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();
}
}
}
со следующими конфиг.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>
к сожалению, это (не очевидно для меня сначала) не определяет класс CollectionUtils
в пакете collections
, но в пакете 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 и исходных файлов он делает довольно хорошую работу.
к настоящему времени я убежден, что зависимости не включены в иерархию по дизайну (это так?), вероятно, чтобы избежать накладных расходов. Однако есть ли способ либо просто получить все зависимости сразу, либо даже лучше получить все зависимости I нужно? И почему он так устроен?
3 ответов
если мы проанализируем POM общей конфигурации, мы увидим, что commons-collections
зависимость является обязательным:
<dependencies>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
<optional>true</optional>
</dependency>
...
кроме того, из документов Maven:
если пользователь хочет использовать функции, связанные с дополнительным зависимость, они должны будут переопределить эту необязательную зависимость в собственный проект.
этот вопрос объясняется на зависимости времени выполнения страница веб-сайта конфигурации Commons.
цитата из этой страницы:
в Maven POM объявлено множество зависимостей. Все это необходимо во время компиляции. во время выполнения, однако, вам нужно только добавить зависимости к вашему пути к классам, которые требуются частями используемого вами пакета конфигурации Commons. следующая таблица поможет вам определите, какие зависимости необходимо включить на основе компонентов, которые вы собираетесь использовать.
другие ответы объясняют, почему это работает с точки зрения Maven. Этот ответ призван обеспечить защиту, в некотором роде, для людей конфигурации Commons. Они хотя бы предупредили тебя!
в случаях, когда зависимости находятся на других компонентах Apache Commons, они потратили время на тестирование с различными версиями и опубликовали информацию о совместимости внизу страницы.
Maven пытается разрешить все необходимые зависимости для библиотеки, которую вы используете в своем pom. Ну, иногда у вас есть некоторые зависимости, которые необходимы только для некоторых конкретных функций, и вы не хотите заставлять пользователя вашей зависимости загружать его, если он не использует его. Тогда вы объявляете свою зависимость как дополнительно. Это случилось с commons-collections
внутри commons-configuration
. См.commons-configuration
-пом здесь