概要
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 とソース ファイルに関しては、かなりうまく機能すると思いました。
今では、おそらくオーバーヘッドを避けるために、依存関係が設計上階層に含まれていないことを確信しています (そうですか?)。ただし、すべての依存関係を一度に取得する方法、または必要なすべての依存関係を取得する方法はありますか? そして、なぜこのように設計されているのですか?