我有一个简单的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)
如果所有其他方法都失败,您可以使用两个不同的文件名,例如props-default.propertiesinsidemyJar.jar和props.propertiesto override 在命令行上。在您的代码中,您将尝试首先加载该文件,然后在未找到该文件时props.properties回退。props-default.properties
| 归档时间: |
|
| 查看次数: |
80055 次 |
| 最近记录: |