Apache Commons配置 - 无法加载/使用配置文件

问题描述:

我一直在试图配置一个Java应用程序(特别是我的集成测试),绝对没有成功。我原来有一个单一的XMLConfiguration,我可以加载和使用没有问题。我的目录设置是这样的:Apache Commons配置 - 无法加载/使用配置文件

  • SRC
    • 测试
      • 的Java
        • mypackage的
      • 资源

之前,我在资源目录中有一个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或/家庭或任何写一个配置文件来配置应用程序本身,所以我做了一个新的文件在同一位置名为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"); 
    } 
} 

当我运行我的集成测试,我认为没有耶,我看不出有什么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):确保的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: 我通过输出多一点,埋在从公共我发现,它似乎最终加载正确的文件中的投诉看。我想我可能会工作?也许我的属性路径改变,当我像这样加载它...我有一些东西要尝试。无论如何,我问到的问题已得到解决。谢谢您的帮助。

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

+0

奇怪。我已经习惯了Maven处理我的依赖关系,并且它不在那里 - 我特别添加了它的依赖关系,并且它肯定会改变某些内容。谢谢! – 2012-04-17 18:58:11

+1

我在我的classpath中有这个bean utils,问题仍然存在@Bozho – Napster 2014-03-22 09:45:55

Pfft。 A multi-page document讨论如何加载配置文件。但是他们是否忘记在绝对Windows路径中执行文件URL的检测,例如c:\ Users \ USER \ FOO \ bar.xml?下议院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