2012-02-28 56 views
1

以下情形加载外部属性文件在同级目录

./ 
config/ 
    application.properties 
lib/ 
    properties-loader-0.0.1-SNAPSHOT.jar 
acme.sh 

properties-loader-0.0.1-SNAPSHOT.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,但仍然有问题访问属性文件

所有这些电话无法加载该文件。

我只知道错误与类路径有关,但似乎无法找到它。我在github上创建了一个重现问题的示例项目项目。

+0

@drhirsch我认为在这种情况下,标签'maven-assembly-plugin'标签可能比'assemblies'更合适。 – oschrenk 2012-02-28 18:48:11

+0

当然,把它改成你认为合适的东西 - 但是像以前一样,“组装”是错误的。事实上,正是这个标签,是我带来的 - 它是关于机器码的。每个标签都有一个描述 - 如果您不确定,请阅读它。 – hirschhornsalz 2012-02-28 18:52:31

+0

忘记我可以自己改变它。谢谢你的提示。 – oschrenk 2012-02-28 18:56:54

回答

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文件(如一个子资源)。如果修改您的命令是这样的:

​​

然后你可以看你的财产在你的程序文件如:

Thread.currentThread().getContextClassLoader().getResourceAsStream("application.properties"); 

作为一个侧面说明,它总是最好使用在classpath完全合格的路径设置。


*编辑*

这是一个工作的例子,应该说明资源加载:

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

+0

我正确地理解classpath参数应该只包含路径和jar,以便可以从那里加载子资源?另外我[尝试](https://github.com/oschrenk/properties-loader/compare/stackoverflow)解决方案,但它仍然返回null作为InputStream。 – oschrenk 2012-02-28 18:32:29

+0

是的,你的classpath只能包含'paths'和archives(jars)。我编辑了我的答案,其中包含一个应该能够正确执行的例子。 – Perception 2012-02-28 19:09:10

+0

我可以按照你的例子。感谢澄清。 – oschrenk 2012-02-28 19:31:58