在兄弟目录中加载外部属性文件

时间:2012-02-28 16:48:15

标签: java maven properties classpath maven-assembly-plugin

以下方案

./
 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项目,可以重现问题。

1 个答案:

答案 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