Почему 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-пом здесь