【问题标题】:Override properties file from jar覆盖 jar 中的属性文件
【发布时间】:2018-10-19 12:40:53
【问题描述】:

我的 Maven 依赖项的 .jar 之一中有一个属性文件。我想覆盖我的应用程序中的值,所以我创建了一个具有相同名称和相同包的文件,但 jar 文件中的值仍在使用中。如果我从 jar 中删除属性文件,则会使用我的应用程序中文件的值。我怎样才能始终使用我的应用程序中的属性而不是 .jar ?

【问题讨论】:

  • 您是如何准确阅读这些文件的?
  • 您的应用可以模仿Spring's approach 之一。
  • 属性文件通过 ResourceBundle.getBundle(baseName, locale) 读取

标签: java classpath


【解决方案1】:

只要代码从类路径中获取你的属性文件,它就取决于你的类路径是如何配置的。

如果您将文件从任何 jar 文件中外部化 - 尝试在 java 命令 -cp 参数中将实际文件所在目录的路径放在任何其他 jar 文件的前面。

如果您将文件保存在自己的 jar 文件中,在类路径中 - 您的 jar 文件必须位于具有默认属性文件的依赖 jar 文件之前。

这些仍然不是好的解决方案(有时很难控制 JVM 将首先使用哪个路径)。

因此,请尝试查找有关您的依赖项 jar 的文档 - 它可能具有指向从何处以及要使用哪个属性文件的属性。

【讨论】:

    【解决方案2】:

    您可以使用Maven Resource Plugin 并参数化您的配置文件,以便您可以pass the parameters as arguments through command line

    【讨论】:

      【解决方案3】:

      使用 jar 中的属性资源作为模板,您将使用的属性文件的初始文件:

      Path propertiesFile = Paths.get(System.getProperty("user.home"),
              ".myapp/config.properties");
      Files.createDirectories(propertiesFile.getParent());
      
      if (!Files.exists(propertiesFile)) {
          Files.copy(getResourceAsStrem("/config.properties"), propertiesFile);
      }
      
      Properties props = new Properties();
      props.load(new FileInputStream(propertiesFile.toString());
      

      【讨论】:

        【解决方案4】:

        这个怎么样?

        • 用覆盖的值重命名属性文件, 像这样 _override.properties (如果实际文件是 称为 original.properties。
        • 现在,在您的代码中,读取名为“toOverrideProps”的系统属性(如果为真)以加载被覆盖的属性文件
        • 运行程序时,可以使用 -Dprop=value 方法设置此属性 这样,您可以在启动时选择使用实际的属性文件或覆盖的属性文件,而不会发生冲突。

        【讨论】:

          猜你喜欢
          • 2017-10-14
          • 1970-01-01
          • 2013-08-16
          • 2011-09-10
          • 1970-01-01
          • 2021-09-14
          • 2016-08-07
          • 2012-09-05
          相关资源
          最近更新 更多