Apache Commons Configuration -- Cannot load/use config files

18,065

Solution 1

You seem to be missing commons-beanutils on your classpath. Make sure that jar is there.

Solution 2

Pfft. A multi-page document talks about how to load a configuration file. But did they forget to implement detection of file URLs in absolute Windows paths such as c:\Users\USER\FOO\bar.xml? Commons 1.9 will show this scrupulous message,

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

Share:
18,065
Patrick Garrity
Author by

Patrick Garrity

Updated on June 04, 2022

Comments

  • Patrick Garrity
    Patrick Garrity almost 2 years

    I've been trying to configure a Java application (specifically my integration tests) with absolutely no success. I originally had a single XMLConfiguration which I could load and use without issue. My directory setup looks like:

    • src
      • test
        • java
          • mypackage
        • resources

    Before, I had a file myconfig.xml in the resources directory. I was loading it it like so:

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

    Now I'm trying to make it so that users can configure the application themselves by writing a configuration file in /etc or /home or whatever, so I made a new file in the same location called 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>
    

    The file /etc/myconf/myconfig.xml does not exist, but that's the whole point of making it optional. I've tried a few different approaches to loading my configuration, including how the documentation does it: http://commons.apache.org/configuration/userguide/howto_configurationbuilder.html. What I have currently is the following:

    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");
        }
    }
    

    When I run my integration tests, I see no Yay, I see no Herp and I see no Derp. If I place a println before I try to load things, it does print so configure is being called. The output I get from commons configuration amounts to:

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

    Those initialize methods are just calling configure and then trying to get data from the configuration that is loaded. I've been working with this for a couple hours now and could really use another pair of eyes. Any ideas? Is there anything I could have changed that I'm not mentioning that would affect this? Thanks.

    Edit #1 (1:58pm): After making sure beanutils were on the classpath, I now get a brutal explosion of stack trace that starts with

    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]
    

    And so on and so on... but I do see 'Yay' now. Now what I don't get is that it doesn't seem to be looking for my non-optional configuration source, or assuming it's in a location I never told it to look.

    Edit #2: I looked through my output a bit more and buried in the complaints from commons I found that it seemed to load the correct file eventually. I think I may have it working? Maybe my path to the properties change when I load it like this... I've got some stuff to try. Anyway, the problem that I asked about has been fixed. Thanks for the help.

  • Patrick Garrity
    Patrick Garrity about 12 years
    Weird. I've gotten used to maven handling my dependencies for me and it wasn't there -- I added a dependency for it specifically, and it definitely changed something. Thanks!
  • Napster
    Napster about 10 years
    I have this bean utils in my classpath, the problem is still there @Bozho