2015-09-04 132 views
3

我正在构建需要读取外部属性文件的jar(使用Maven和Spring Boot)。它应该在运行jar的相同目录中(或者在它的相对路径中,如./config.properties./conf/config.properties从jar中读取外部配置文件

现在我可以成功读取资源目录中的嵌入式jar,但是如果我尝试从本地目录中的InputStream将是null

我试着加入本地目录.到classpath(拆包罐子,我可以看到它的类路径条目),但它并没有奏效。

这就是我试过的:

InputStream in = PropertiesLoader.class.getResourceAsStream("config.properties") 
InputStream in = PropertiesLoader.class.getResourceAsStream("./config.properties") 
InputStream in = PropertiesLoader.class.getClassLoader().getResourceAsStream("./config.properties") 
InputStream in = PropertiesLoader.class.getClass().getResourceAsStream("./config.properties") 

在我的pom.xml我有这样的条目添加到本地目录添加到类路径:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.4</version> 
    <configuration> 
     <archive> 
      <manifest> 
       <addClasspath>true</addClasspath> 
       <classpathPrefix>lib/</classpathPrefix> 
       <mainClass>bla.bla.Main</mainClass> 
      </manifest> 
      <manifestEntries> 
       <Class-Path>.</Class-Path> 
      </manifestEntries> 
     </archive> 
    </configuration> 
</plugin> 

我也尝试了user.dir财产,但没有更迭。

这应该是“容易”,但我很迷茫。

+1

cmiiw,你正在尝试从你的jar文件中读取一个与你的jar文件相同的目录吗?如果是的话,那么我猜'新的FileInputStream(“./ file_name.txt”)'应该够用了吗? –

+0

您是否在JAR中使用了'application.properties'文件? JAR之外的'config.properties'文件是否被覆盖? – geoand

+0

@kucing_terbang hm ..我得到了一个FileNotFound .. – Enrichman

回答

0

Spring Boot可以为零配置完成读取属性文件的所有繁重工作。没有必要手动读取属性文件。有关详细信息,请参阅this部分文档。

为了让您的生活变得尽可能容易,我提出以下(实际上是Spring启动默认的策略):

有一个application.properties文件src/resources其中包含的所有属性的默认值。 在将运行jar的环境中,在与jar相同的目录中或在名为config的子目录中,有一个名为application.properties的文件。

一旦你这样做,每个属性将通过@Value注释或@ConfigurationProperties类型处理在Spring Beans中可用。

另外请注意,你能说出只要属性文件比application.properties其他的东西,你设置--spring.config.name=config运行的罐子时,例如java -jar somejar.jar --spring.config.name=config

+0

恩,谢谢。我已经看过了。我并不是很兴奋使用注射这样的东西,但我会试一试。因此,似乎没有办法告诉Spring Boot使用不同的文件名(在运行时告诉他该属性的一部分)? – Enrichman

+0

你也可以使用标准的Spring @ @ PropertySource。不过,我建议坚持公约,并使用财产注入。它们将使您的生活更轻松,并使应用程序更加可测试,即手动滚动属性文件读取 – geoand

0

我下面尝试,它成功地工作:

Properties properties = new Properties(); 
properties.load(new FileInputStream("./test/application.properties")); 

或弹簧方式

Properties properties = PropertiesLoaderUtils.loadProperties(new FileSystemResource("./test/application.properties")); 

他们都做同样的伎俩,第二是安全的,所以你做nt需要关闭输入流。

诀窍是,你需要打包test文件夹与src相同的水平,以使其与maven协同工作。所以当你有jar时,你可以创建测试文件夹并把文件放进去。

也被测试为罐子。