如何动态更新属性文件?

2024-05-02

我的应用程序是一个批处理过程,它从 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 外部创建一个新的属性文件?

下面的示例代码片段:

属性.配置:

username=user
password=password123

应用程序.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();
            }
        }

可能会根据运行环境而改变的应用程序的属性应该never被封装在封装组件内。
它不应该硬耦合到组件,并且如果需要,它也应该可以修改,而无需修改打包的组件。
此外,属性可能包含机密信息(如您的情况:用户名和密码)。
所以最好直接存储在目标环境上。

例如,云原生应用程序原则之一Heroku/十二因素 https://12factor.net/config(这通常也是良好的做法)是“将配置存储在环境中”。

因此,出于同样的原因,必须绝对避免更新打包组件内的属性文件。
除此之外,如果发生错误,这会使状态应用程序更难以重现。


对于您的情况,只需填写username and password根据目标环境在特定的属性文件中存储属性,并将该文件存储在环境中。

然后您只需通过指定此属性文件来运行应用程序。
例如对于 Windows:

java -jar yourApp-1.0.jar --spring.config.location=file:///D:/application-target-env.properties

这是关于它的参考文档:24.2 访问命令行属性 http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-application-property-files

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何动态更新属性文件? 的相关文章

  • 将链接对象转换为流或集合

    我想迭代堆栈跟踪 堆栈跟踪由可抛出对象组成 其 getCause 返回下一个可抛出对象 最后一次调用 getCause 返回 null 示例 a gt b gt null 我尝试使用 Stream iterable 这会导致 NullPoi
  • jdbc-initialize-database 找不到脚本文件 - DataAccessResourceFailureException

    我无法让我的 Spring Web 应用程序找到我的脚本 我已经配置了 jdbc 命名空间 我已经写好了脚本 但是 我不明白为什么无论我把脚本放在哪里 都找不到它们 我特别将文件夹标记为 类文件夹 我把它们和我所有的罐子放在同一个文件夹里
  • 由于连接超时,无法通过 ImageIO.read(url) 获取图像

    下面的代码似乎总是失败 URL url new URL http userserve ak last fm serve 126 8636005 jpg Image img ImageIO read url System out printl
  • JTree 节点不会被直观地选择

    不知何故 我无法为我的 JTree 节点启用 选择突出显示 我正在我的项目中使用自定义单元格渲染器 这很可能导致此问题 这是完整的渲染器类代码 protected class ProfessionTreeCellRenderer exten
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • MI设备中即使应用程序被杀死,如何运行后台服务

    您好 我正在使用 alaram 管理器运行后台服务 它工作正常 但对于某些 mi 设备 后台服务无法工作 我使用了服务 但它无法工作 如何在 mi 中运行我的后台服务 MI UI有自己的安全选项 所以你需要的不仅仅是上面提到的粘性服务 你需
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • spring - 强制 @Autowired 字段的 cglib 代理

    我有混合堆栈 EJB 和 Spring 为了将 Spring 自动装配到 EJB 我使用SpringBeanAutowiringInterceptor 不确定这是否会影响我遇到的问题 在尝试通过以下方式自动装配 bean 时 Scope p
  • 使用 Java 在浏览器中下载 CSV 文件

    我正在尝试在 Web 应用程序上添加一个按钮 单击该按钮会下载一个 CSV 文件 该文件很小 大小仅约 4KB 我已经制作了按钮并附加了一个侦听器 文件也准备好了 我现在唯一需要做的就是创建单击按钮时下载 csv 文件的实际事件 假设 fi
  • cucumber-junit-platform-engine 中的功能文件发现

    In cucumber junit我使用的库 CucumberOptions定义功能文件位置 package com mycompany cucumber import cucumber api CucumberOptions import
  • 参数动态时如何构建 JPQL 查询?

    我想知道是否有一个好的解决方案来构建基于过滤器的 JPQL 查询 我的查询太 富有表现力 我无法使用 Criteria 就像是 query Select from Ent if parameter null query WHERE fiel
  • 让JScrollPane控制多个组件

    对于我的应用程序 我正在设计一个脚本编辑器 目前我有一个JPanel其中包含另一个JPanel保存行号 位于左侧 以及JTextArea用于允许用户输入代码 位于右侧 目前 我已经实施了JScrollPane on the JTextAre
  • Apache Commons CLI:替代已弃用的 OptionBuilder?

    IntelliJ 显示此示例代码中不推荐使用 OptionBuilderhttp commons apache org proper commons cli usage html http commons apache org proper
  • OpenJDK 版本控制

    上下文 我想确保我们系统上安装的 Java 不受 CVE 2022 21449 的影响 java version 给出 openjdk version 11 0 7 2020 04 14 LTS OpenJDK Runtime Enviro
  • 如何为 Jackson 编写一个包罗万象的(反)序列化器

    当您提前知道类型时 编写自定义序列化器非常容易 例如 MyType一个人可以写一个MyTypeSerializer extends StdSerializer
  • 如何在keycloak中动态编辑standalone.xml文件

    我正在尝试通过 docker 编辑standalone xml 并尝试添加 但 keycloak 正在使用它standalone xml 但我可以看到standalone xml 文件中的更改 我需要在standalone xml 文件中添
  • 来自客户端的超时 Web 服务调用

    我正在使用 RestEasy 客户端调用网络服务 一项要求是 如果调用运行时间超过 5 秒 则中止 超时调用 我如何使用 RestEasy 客户端实现这一目标 我只看到服务器端超时 即如果在一定时间内未完成请求 Rest Easy 网络服务
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这

随机推荐