4

私はJavaアプリケーション(特に統合テスト)を構成しようとしましたが、まったく成功しませんでした。私はもともと、問題なくロードして使用できる単一のXMLConfigurationを持っていました。私のディレクトリ設定は次のようになります。

  • src
    • テスト
      • java
        • mypackage
      • 資力

以前は、resourcesディレクトリにmyconfig.xmlファイルがありました。私はそれを次のようにロードしていました:

private static XMLConfiguration configuration = null;
public static void configure() {
    try {
        configuration = new XMLConfiguration("myconfig.xml");
    }
    catch (ConfigurationException e) {
        System.err.println(e);
    }
}

現在、ユーザーが/etcや/homeなどに構成ファイルを書き込んでアプリケーションを自分で構成できるようにしようとしているので、同じ場所にconfig-test.xmlという名前の新しいファイルを作成しました。

<?xml version="1.0" encoding="ISO-8859-1"?>
<configuration>
    <!-- Attempt to load configuration provided on the system -->
    <xml fileName="/etc/myconf/myconfig.xml" config-optional="true" />

    <!-- Load default configuration from the classpath -->
    <xml fileName="myconfig.xml" />
</configuration>

ファイル/etc/myconf/myconfig.xmlは存在しませんが、それがオプションにするための重要なポイントです。ドキュメントの実行方法など、構成をロードするためのいくつかの異なるアプローチを試しました: http: //commons.apache.org/configuration/userguide/howto_configurationbuilder.html。私が現在持っているのは次のとおりです。

private static CombinedConfiguration configuration = null;
public static void configure() {
    try {
        DefaultConfigurationBuilder builder = 
            new DefaultConfigurationBuilder("config-test.xml");
        configuration = builder.getConfiguration(true);
        System.err.println("Yay");
    }
    catch (ConfigurationException e) {
        System.err.println("Herp");
    }
    catch (Exception e) {
        System.err.println("Derp");
    }
}

統合テストを実行すると、Yay、Herp、Derpが表示されません。printlnロードしようとする前に配置すると、印刷されるのでconfigure呼び出されます。コモンズ構成から得られる出力は次のようになります。

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running TestSuite
13:36:57.752 [main] DEBUG o.a.c.c.ConfigurationUtils - ConfigurationUtils.locate(): base is null, name is config-test.xml
13:36:57.753 [main] DEBUG o.a.c.c.DefaultFileSystem - Could not locate file config-test.xml at null: no protocol: config-test.xml
13:36:57.756 [main] DEBUG o.a.c.c.ConfigurationUtils - Loading configuration from the context classpath (config-test.xml)
13:36:57.766 [main] DEBUG o.a.c.c.DefaultConfigurationBuilder - Creating configuration null with name null
13:36:57.795 [main] DEBUG o.a.c.c.ConfigurationUtils - ConfigurationUtils.locate(): base is null, name is config-test.xml
13:36:57.795 [main] DEBUG o.a.c.c.DefaultFileSystem - Could not locate file config-test.xml at null: no protocol: config-test.xml
13:36:57.796 [main] DEBUG o.a.c.c.ConfigurationUtils - Loading configuration from the context classpath (config-test.xml)
13:36:57.800 [main] DEBUG o.a.c.c.DefaultConfigurationBuilder - Creating configuration null with name null
Tests run: 56, Failures: 2, Errors: 0, Skipped: 16, Time elapsed: 2.589 sec <<< FAILURE!

Results :

Failed tests:   initialize(mypackage.ImportTestIT): org/apache/commons/beanutils/PropertyUtils
  initialize(mypackage.TransferTestIT): org/apache/commons/beanutils/PropertyUtils

Tests run: 56, Failures: 2, Errors: 0, Skipped: 16

これらの初期化メソッドは、ロードされた構成からデータを呼び出しconfigureて取得しようとしているだけです。私はこれを数時間使っており、実際に別の目を使うことができました。何か案は?これに影響を与えると私が言及していない変更した可能性があるものはありますか?ありがとう。

編集#1(1:58 pm): beanutilsがクラスパスにあることを確認した後、スタックトレースの残忍な爆発が発生します。

Running TestSuite
14:00:16.088 [main] DEBUG o.a.c.c.ConfigurationUtils - ConfigurationUtils.locate(): base is null, name is config-test.xml
14:00:16.089 [main] DEBUG o.a.c.c.DefaultFileSystem - Could not locate file config-test.xml at null: no protocol: config-test.xml
14:00:16.093 [main] DEBUG o.a.c.c.ConfigurationUtils - Loading configuration from the context classpath (config-test.xml)
14:00:16.103 [main] DEBUG o.a.c.c.DefaultConfigurationBuilder - Creating configuration null with name null
14:00:16.178 [main] DEBUG o.a.c.c.ConfigurationUtils - ConfigurationUtils.locate(): base is file:///home/pgarrity/projects/myproject/target/test-classes/config-test.xml, name is /etc/myconf/myproject/myconfig.xml
14:00:16.179 [main] DEBUG o.a.c.c.DefaultFileSystem - Could not locate file /etc/myconf/myproject/myconfig.xml at file:///home/pgarrity/projects/myproject/target/test-classes/config-test.xml: /etc/myconf/myproject/myconfig.xml (No such file or directory)
14:00:16.181 [main] DEBUG o.a.c.c.DefaultConfigurationBuilder - Load failed for optional configuration xml: Cannot locate configuration source /etc/myconf/myproject/myconfig.xml
14:00:16.185 [main] WARN  o.a.c.c.DefaultConfigurationBuilder - Internal error
org.apache.commons.configuration.ConfigurationException: Cannot locate configuration source /etc/myconf/myproject/myconfig.xml
at org.apache.commons.configuration.AbstractFileConfiguration.load(AbstractFileConfiguration.java:259) ~[commons-configuration-1.8.jar:1.8]
at org.apache.commons.configuration.AbstractFileConfiguration.load(AbstractFileConfiguration.java:238) ~[commons-configuration-1.8.jar:1.8]

などなど...しかし、私は今「Yay」を見ています。今私が得ていないのは、それが私のオプションではない構成ソースを探していないように見えるか、それが私が決して見るように言わなかった場所にあると仮定しているということです。

編集#2: 出力をもう少し調べて、コモンズからの苦情に埋もれてしまいました。最終的には正しいファイルが読み込まれるように見えました。私はそれが機能しているかもしれないと思いますか?このようにロードすると、プロパティへのパスが変わる可能性があります...試してみることがいくつかあります。とにかく、私が尋ねた問題は修正されました。助けてくれてありがとう。

4

2 に答える 2

3

クラスパスにcommons-beanutilsがないようです。瓶がそこにあることを確認してください。

于 2012-04-17T18:51:19.453 に答える
3

Pfft。複数ページのドキュメントでは、構成ファイルをロードする方法について説明しています。しかし、c:\ Users \ USER \ FOO \ bar.xmlなどの絶対WindowsパスにファイルURLの検出を実装することを忘れていましたか?Commons 1.9は、この綿密なメッセージを表示します。

DEBUG DefaultFileSystem - Could not locate file C:\Users\USER\FOO\bar.xml at null: unknown protocol: c

https://github.com/apache/commons-configuration/blob/CONFIGURATION_1_9/src/main/java/org/apache/commons/configuration/DefaultFileSystem.java#L281

于 2017-01-11T23:14:47.477 に答える