[英]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.jar
和props.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.