【问题标题】:Overriding a resource contained in a jar file覆盖 jar 文件中包含的资源
【发布时间】:2014-08-26 02:28:33
【问题描述】:

我正在通过 jar 文件中的代码运行一个工具(虚拟地球仪)。代码读取资源(一个 XML 文件)以提供一些配置选项,使用类似这样的语法,在类 Config 的方法中:

URL localURL = Config.class.getResource("Config.xml");

我想为我自己的 Config.xml 文件提供覆盖 jar 文件中包含的设置的设置。

我不清楚如何做到这一点。我了解 getResource() 方法探索类路径以查找资源。所以我想到了这个: - 将带有我自己设置的文件副本放在特定目录中 - 将此目录放在类路径前面

但无济于事:getResource() 仍然总是从 jar 文件中加载资源。

我一定是错过了什么……

我尝试从应用程序 jar 中删除 Config.xml 文件。失败:应用程序失败,因为 getResource() 返回 null。在我看来像

Config.class.getResource("Config.xml") 

只在包含类 Config 的 jar 文件中查找资源,而我认为它是在类路径中查找。

【问题讨论】:

  • 最快的方法是打开 jar(例如用 winrar)并替换 Config.xml 文件。
  • 不能直接将修改后的文件添加到jar中吗?
  • 当然可以。但我真的很想避免它。我真的很想让用户通过提供他们自己的自定义配置设置来自定义他们的执行环境。
  • 在使用 getResource() 之前检查配置文件是否存在于您想要的位置并改为加载它
  • 您只能通过将您自己的 Config.xml “早期”放在应用程序的类路径中来做到这一点。

标签: java jar getresource


【解决方案1】:

好的,知道了。问题是这样的:我的 Config 类确实在一个包中,即 vis.globe.Config.java,所以 getResource("Config.Xxml") 确实在寻找一个名为 vis.globe.Config.xml 的文件。

因此,对于诸如“../config:../jar/appl.jar”之类的类路径,它将查找文件 Config.xml,而不是在 ../config 中,而是在 ../config/vis 中/地球。

因此解决方案是在 ../config 中创建一个反映类 Config.java 的完全限定名称的子目录结构,即

../config/vis/globe/Config.xml

【讨论】:

    【解决方案2】:

    您总是可以寻求以编程方式做某事。因此,例如,您将首先搜索一个名为 UserConfig.xml 的文件,如果没有找到它,则回退到可以在 jar 文件中找到的名为 Config.xml 的文件。

    【讨论】:

      猜你喜欢
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 2022-01-24
      • 1970-01-01
      • 2013-04-25
      • 2011-01-22
      相关资源
      最近更新 更多