我正在构建一个需要读取外部属性文件的jar(使用Maven和Spring Boot)。它应该在正在运行的jar的同一目录中(或者在它的相对路径中,如./config.properties
或./conf/config.properties
。
现在我可以在资源目录中成功读取嵌入式jar,但如果我尝试从本地目录读取它,则InputStream将为null
。
我已经尝试将本地目录.
添加到类路径中(解压jar我可以在Class-Path条目中看到它),但它没有用。
这就是我的尝试:
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
属性但没有成功。
这应该是“容易的”,但我很遗憾。
答案 0 :(得分:0)
Spring Boot可以为您完成所有繁重的读取属性文件,零配置。无需手动读取属性文件。有关详细信息,请参阅文档的this部分。
为了让您的生活尽可能轻松,我提出以下建议(实际上是Spring Boot默认策略):
在application.properties
中有一个src/resources
文件,其中包含所有属性的默认值。
在将运行jar的环境中,将名为application.properties
的文件放在与jar相同的目录中,或放在名为config
的子目录中。
一旦这样做,每个属性都将通过@Value
注释或@ConfigurationProperties
类型处理在Spring Beans中提供。
另请注意,只要在运行jar时设置application.properties
,就可以将属性文件命名为--spring.config.name=config
以外的其他属性,例如java -jar somejar.jar --spring.config.name=config
答案 1 :(得分:0)
我在下面尝试过,它成功地运作了:
Properties properties = new Properties();
properties.load(new FileInputStream("./test/application.properties"));
或春天的方式
Properties properties = PropertiesLoaderUtils.loadProperties(new FileSystemResource("./test/application.properties"));
他们都做同样的技巧,第二个是安全的,所以你不需要关闭输入流。
诀窍是,您需要将test
文件夹与src
相同的级别进行创建,以使其与maven一起使用。因此,当你拥有jar时,你可以创建测试文件夹并将文件放入其中。
也作为一个罐子进行过测试。