繁体   English   中英

从类路径中的任何地方加载资源

[英]Load resource from anywhere in classpath

我有一个简单的Java应用程序,可从当前包中加载属性文件。

this.getClass().getResourceAsStream("props.properties");

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

我希望通过命令行覆盖属性文件变得如此简单:

java.exe -classpath props.properties;myJar.jar com.test.MyApp

我不想解压缩JAR并修改属性文件以更改某些内容。 我觉得我缺少明显的东西...

Class.getResourceAsStream()Javadoc记录了查找逻辑:

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

否则,绝对名称的格式如下:
modified_package_name/name

其中modified_package_name是此对象的软件包名称,用“ /”代替'.' '\.' )。

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

我确定答案为时已晚,但是对于Google员工来说,这个小代码段帮助程序可以从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
            }

        }
    }

如果所有其他方法均失败,则可以使用两个不同的文件名,例如props-default.properties myJar.jarprops.properties在命令行上覆盖。 在您的代码中,您将尝试首先加载props.properties文件,如果找不到该文件,则回props-default.properties

我不确定,但也许: ClassLoader.getResourceAsStream()

编辑:

我认为这与问题中的this.getClass().getResourceAsStream()并没有显着区别,因为如上所述,您仍然必须获取要用于加载资源的ClassLoader。

由于您在示例中的-classpath中提供了资源,因此应该可以从与“主”类相同的类加载器中使用该资源(在SUN JVM中为sun.misc.Launcher$AppClassLoader ,不确定是否可以这样做)因其他JVM实现而异)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM