我的应用程序是一个批处理过程,它从application.properties文件中提取环境变量。我使用的密码必须每隔几个月更新一次。我想自动化密码更新过程并将更新后的密码保存在属性文件中,以便在将来的运行中使用它,但我尝试进行的任何更新都不会传播到application.config文件。
当我在Intellij中运行时,没有错误,但文件未更新。当我将应用程序作为jar运行时,它会给出:
java.io.FileNotFoundException: file:{localpath}\application.jar!\BOOT-INF\classes!\application.properties (The filename, directory name, or volume label syntax is incorrect)
如何动态更新jar中的application.properties文件,或者在应用程序首次运行时是否需要在jar外部创建新的属性文件?
示例代码下面的代码:
properties.config:
username=user
password=password123
Application.java:
//get properties
prop = new Properties();
InputStream input = null;
try {
input = new FileInputStream(f);
// load a properties file
prop.load(input);
} catch (IOException ex) {
logger.error("Error reading application.properties", ex);
ex.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//update properties
prop.setProperty("TESTSTRING", "testvalue");
//write to properties file
OutputStream os = null;
try{
File f = new File(Application.class.getClassLoader().getResource("application.properties").getFile());
os = new FileOutputStream(f);
prop.store(os, comments);
}catch(IOException ex){
logger.error("Error updating application.properties", ex);
ex.printStackTrace();
} finally {
if(os != null){
try{
os.close();
} catch (IOException e){
e.printStackTrace();
}
}
答案 0 :(得分:1)
根据运行环境可能会更改的应用程序的属性应从不打包在打包的组件中。
它应该不与组件硬连接,并且如果需要也可以在不修改包装组件的情况下进行修改
此外,属性可能包含机密信息(如您的情况:用户名和密码)。
因此,它应该优选地直接存储在目标环境中。
例如,来自Heroku/twelve factors的云本机应用程序原则之一(通常也是一些好的做法)是"将配置存储在环境中"。
因此,出于同样的原因,必须绝对避免更新打包组件内的属性文件
除此之外,如果发生错误,状态应用程序将更难以重现。
在您的情况下,只需根据目标环境在特定属性文件中填写username
和password
属性,并将此文件存储在环境中。
然后您只需通过指定此属性文件来运行应用程序 例如对于windows:
java -jar yourApp-1.0.jar --spring.config.location=file:///D:/application-target-env.properties
以下是有关它的参考文档: 24.2 Accessing command line properties