从classpath中的任何位置加载资源

sch*_*d04 33 java

我有一个简单的java应用程序,它从当前包中加载属性文件.

this.getClass().getResourceAsStream("props.properties");
Run Code Online (Sandbox Code Playgroud)

当我想要的属性文件在当前包中时,这可以正常工作.但是,我想将此应用程序打包为JAR,并使用我使用它的新属性文件定义和覆盖.有没有办法加载类路径上名为"props.properties"的第一个资源?

我希望通过命令行轻松覆盖属性文件:

java.exe -classpath props.properties;myJar.jar com.test.MyApp
Run Code Online (Sandbox Code Playgroud)

我不想解压缩JAR并修改属性文件来改变一些东西.我觉得我错过了一些明显的东西......

mat*_*t b 27

对的JavadocClass.getResourceAsStream()文档的查找逻辑:

如果名称以'/'('\u002f')开头,则资源的绝对名称是"/"后面的名称部分.

否则,绝对名称具有以下形式:
modified_package_name/name

其中modified_package_name是此对象的包名称,用'/'代替'.'('\u002e').

因此,换句话说,传递给方法的资源名称应该看起来像/com/package/p2/props.properties,如果props.properties存储在com.package.p2包而不是当前类的.


Abd*_*DMA 13

我确定答案为时已晚,但对于googlers这个小代码片段帮助程序从Classpath中的任何位置加载属性文件可能会很有趣.

ClassLoader cl = ClassLoader.getSystemClassLoader();
    if (cl != null) {
        URL url = cl.getResource(CONF_PROPERTIES);
        if (url == null) {
            url = cl.getResource("/" + CONF_PROPERTIES);
        }
        if (url != null) {
            try {
                InputStream in = url.openStream();
                props = new Properties();
                props.load(in);
            } catch (IOException e) {
                // Log the exception
            } finally {
               // close opened resources
            }

        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 您是否有特定原因不使用getResourceAsStream? (2认同)

Mik*_*ffe 4

如果所有其他方法都失败,您可以使用两个不同的文件名,例如props-default.propertiesinsidemyJar.jarprops.propertiesto override 在命令行上。在您的代码中,您将尝试首先加载该文件,然后在未找到该文件时props.properties回退。props-default.properties