【问题标题】:How to use ClassLoader.getResources() in jar file如何在 jar 文件中使用 ClassLoader.getResources()
【发布时间】:2012-07-16 00:42:28
【问题描述】:

问题陈述:
我在包mycompany/configuration/file/ 中有一个带有一组配置文件的jar 文件。
我不知道文件名。
我的目的是在运行时从打包它们的 jar 文件中加载文件名,然后在我的应用程序中使用它。
据我了解: 当我使用 ClassLoader.getResources("mycompany/configuration/file/") 时,我应该将所有配置文件作为 URL。
但是,这就是正在发生的事情:
我得到一个 URL 对象,其 URL 类似于 jar:file:/C:/myJarName.jar!mycompany/configuration/file/
你能告诉我我做错了什么吗?

【问题讨论】:

  • “我不知道文件名。” 为什么不呢?谁把它们放在那里的?他们是如何将它们放在那里的(例如 Ant、Maven 等)?
  • @Andrew:作为构建过程的一部分,这些文件由ANT生成并打包在jar文件中。
  • 使用 Ant 生成一个列表并将其包含在其中一个罐子中的已知位置。在运行时阅读列表。
  • 这就是我现在正在做的事情:)

标签: java jar classloader


【解决方案1】:

对于您正在尝试做的事情,我认为这是不可能的。

getResourcegetResources 是关于在类加载器的类路径中查找命名资源,而不是在目录或文件夹下列出值。

例如,ClassLoader.getResources("mycompany/configuration/file/Config.cfg") 将返回所有名为 Config.cfg 的文件,这些文件存在于类加载器的类路径中的 mycompany/configuration/file 路径中(我发现这对于个人加载版本信息特别有用)。

在您的情况下,我认为您可能几乎有一半的解决方案。您返回的 URL 包含源 jar 文件 (jar:file:/C:/myJarName.jar)。您可以使用此信息来破解打开 jar 文件并读取条目列表,过滤名称以“mycompany/configuration/file/”开头的条目。

从那里,您可以使用getResource 方法来加载对每一个的引用(现在您已经有了名称和路径)

【讨论】:

  • 那么每个ClassLoader 都有自己的CLASSPATH?
  • @mhrsalehi 从记忆中,是的,他们可以,但他们也可能继承父类加载器类路径
猜你喜欢
  • 1970-01-01
  • 2010-12-30
  • 2011-08-18
  • 2014-12-31
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
相关资源
最近更新 更多