以下方案
./
config/
application.properties
lib/
properties-loader-0.0.1-SNAPSHOT.jar
acme.sh
properties-loader-0.0.1-SNAPSHOT.jar
是一个带有清单文件的可执行jar。
jar中有一个包com.acme.lab
,只包含类
使用完全限定名称com.acme.lab.PropertiesLoader
。
脚本acme.sh
执行以下命令:
java -cp etc/application.properties:./lib/properties-loader-0.0.1-SNAPSHOT.jar com.acme.lab.PropertiesLoader
我正在尝试从PropertiesLoader
类访问属性文件。我阅读了文章Smartly load your properties,但仍然无法访问属性文件
System.out.println(this.getClass().getResourceAsStream("../etc/application.properties"));
System.out.println(this.getClass().getResourceAsStream("etc/application.properties"));
System.out.println(this.getClass().getResourceAsStream("/etc/application.properties"));
System.out.println(this.getClass().getResourceAsStream("application.properties"));
System.out.println(this.getClass().getClassLoader().getResourceAsStream("../etc/application.properties"));
System.out.println(this.getClass().getClassLoader().getResourceAsStream("etc/application.properties"));
System.out.println(this.getClass().getClassLoader().getResourceAsStream("/etc/application.properties"));
System.out.println(this.getClass().getClassLoader().getResourceAsStream("application.properties"));
try {
System.out.println(ResourceBundle.getBundle("etc.application"));
System.out.println(ResourceBundle.getBundle("application"));
} catch(MissingResourceException e) {
// do nothing
}
所有这些调用都无法加载文件。
我只知道错误与类路径有关,但似乎无法找到它。我在github上创建了一个示例maven项目,可以重现问题。
答案 0 :(得分:4)
从类路径根解释资源。在您运行程序的情况下,如下所示:
java -cp etc/application.properties:./lib/properties-loader-0.0.1-SNAPSHOT.jar
根源
./etc/application.properties
./lib/properties-loader-0.0.1-SNAPSHOT.jar
它们都不包含您的application.properties文件(作为子资源)。如果您修改了这样的命令:
java -cp etc:./lib/properties-loader-0.0.1-SNAPSHOT.jar
然后您可以在程序中读取您的属性文件:
Thread.currentThread().getContextClassLoader().getResourceAsStream("application.properties");
作为旁注,最好在类路径设置中使用完全限定路径。
*编辑*
这是一个应该说明资源加载的工作示例:
mkdir props; cd props
mkdir etc; touch etc/application.properties
mkdir test; vi test/PropLoader.java
将此内容粘贴到编辑器中,然后保存:
package test;
import java.io.InputStream;
public class PropLoader {
public static void main(String[] args) {
try {
final String path;
if(args.length == 1) path = args[0].trim();
else path = "etc/application.properties";
final InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
if(is == null) throw new RuntimeException("Failed to load " + path + " as a resource");
else System.out.printf("Loaded resource from path: %s\n", path);
} catch(Exception e) {
e.printStackTrace();
}
}
}
并测试:
javac test/PropLoader.java
java -cp . test.PropLoader
输出为Loaded resource from path: etc/application.properties
。