【问题标题】:Apache Commons Configuration -- Cannot load/use config filesApache Commons 配置 - 无法加载/使用配置文件
【发布时间】:2012-04-17 18:50:15
【问题描述】:

我一直在尝试配置 Java 应用程序(特别是我的集成测试),但完全没有成功。我最初有一个 XMLConfiguration,我可以毫无问题地加载和使用它。我的目录设置如下:

    • 测试
      • Java
        • 我的包裹
      • 资源

之前,我在资源目录中有一个文件 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。我从 commons 配置得到的输出为:

-------------------------------------------------------
 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): 在确保 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]

等等等等……但我现在确实看到了“耶”。 现在我不明白的是,它似乎并没有在寻找我的非可选配置源,或者假设它位于我从未告诉它寻找的位置。

编辑#2: 我仔细查看了我的输出,并埋头于来自公共的抱怨中,我发现它似乎最终加载了正确的文件。我想我可能有它的工作?当我像这样加载它时,也许我的属性路径会改变......我有一些东西要尝试。不管怎样,我问的问题已经解决了。感谢您的帮助。

【问题讨论】:

    标签: java configuration apache-commons


    【解决方案1】:

    您的类路径中似乎缺少 commons-beanutils。确保罐子在那里。

    【讨论】:

    • 很奇怪。我已经习惯了 maven 为我处理我的依赖项,但它并不存在——我专门为它添加了一个依赖项,它确实改变了一些东西。谢谢!
    • 我的类路径中有这个bean utils,问题仍然存在@Bozho
    【解决方案2】:

    噗。 multi-page document 谈论如何加载配置文件。但是他们是否忘记在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 2016-06-04
      相关资源
      最近更新 更多