7

概要

XMLConfiguration configuration = new XMLConfiguration("config/config.xml");私だけで試してみるときcommons-configuration 1.10、依存関係をさらに追加する必要があります(つまりcommons-collections、より新しくない3.2.1)。なぜそうであり、必要なすべての依存関係を単純に解決しないのはなぜですか?

詳細

commons-configurationを機能させようとしています。最初に、最新バージョンの 2.0-alpha2 を使用したかったのですが、正しいリソースをダウンロードするように Maven を構成できなかったため、まったくうまく機能しませんでしたが、それは別の話です。

バージョン 1.10 が実際には「1.10」(「1.1 ゼロ」ではない) であり、したがって 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

しかし、 Very simple Apache-commons configuration example throws NoClassDefFoundError and its follow-up questionで参照されているものと同様の例を実装しようとすると、そこで参照されているのとまったく同じエラーが発生しましたが、解決策として、インポートorg.apache.commons.beanutils.PropertyUtilsが機能していません。 beanutils がありません。したがって、基本的にダウングレードすることで、コレクションが見つからないというエラーから beanutils が見つからないというエラーに切り替えました。

何をするときにどの依存関係が使用されているかを確認できる依存関係の概要があります。CollectionUtilsバージョン 1.10では、コンストラクター呼び出しで 1.9 とは別の依存関係 (つまり ) が使用されていることを知って、少し驚きました。1.10 にも 1.9 にも依存関係の問題があったので、私は新しいバージョンに固執しました。

CollectionUtils次のアーティファクトにあることがわかりました( mavenリポジトリによって指摘されたため):

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

悲しいことに(最初はわかりませんが)CollectionUtils、 packagecollectionsではなく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 を使用することの要点は、そのようなことをしなくても済むようにすることであり、javadoc とソース ファイルに関しては、かなりうまく機能すると思いました。

今では、おそらくオーバーヘッドを避けるために、依存関係が設計上階層に含まれていないことを確信しています (そうですか?)。ただし、すべての依存関係を一度に取得する方法、または必要なすべての依存関係を取得する方法はありますか? そして、なぜこのように設計されているのですか?

4

3 に答える 3

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>
    ...

さらに、Mavenのドキュメントから:

ユーザーがオプションの依存関係に関連する機能を使用したい場合は、独自のプロジェクトでそのオプションの依存関係を再宣言する必要があります。

于 2015-02-24T10:11:42.243 に答える
3

この問題は、Commons Configuration Web サイトのランタイム依存関係ページで説明されています。

そのページから引用:

多くの依存関係が Maven POM で宣言されています。これらはすべてコンパイル時に必要です。ただし、実行時には、使用している Commons Configuration パッケージの一部に必要な依存関係をクラスパスに追加するだけで済みます。次の表は、使用するコンポーネントに基づいて含める必要がある依存関係を判断するのに役立ちます。

他の回答は、これがMavenの観点から機能する理由を説明しています。この回答は、コモンズ構成の人々にある種の防御を提供することを目的としています。彼らは少なくともあなたに警告しました!

依存関係が他の Apache Commons コンポーネントにある場合は、時間をかけてさまざまなバージョンでテストし、そのページの下部に互換性に関する情報を掲載しています。

于 2015-02-24T10:17:13.637 に答える
1

Maven は、pom で使用しているライブラリに必要なすべての依存関係を解決しようとします。場合によっては、特定の機能にのみ必要な依存関係がいくつかあり、依存関係のユーザーが使用しない場合に、依存関係のユーザーにダウンロードを強制したくない場合があります。次に、依存関係をoptionalとして宣言しています。これはcommons-collections内で発生しましcommons-configurationた。commons-configuration-pomこちらをご覧ください

于 2015-02-24T10:14:32.547 に答える