【问题标题】:How to access a resource / configuration / text file in an external Jar from Java?如何从 Java 访问外部 Jar 中的资源/配置/文本文件?
【发布时间】:2013-01-02 17:45:01
【问题描述】:

我正在 com.me.X.jar 中运行一个程序。

在外部 com.me.Y.jar 中,我有一个配置文件位于 Jar 根目录的“config/conf.txt”。

如何在 Java 中以编程方式访问此配置文件?

com.me.Y.jar 当前未加载到内存中,仅由非代码资源组成。

【问题讨论】:

  • 在类路径中包含 jar 并像任何普通的嵌入式资源一样访问它
  • @MadProgrammer 可能是一个答案。应该嵌入。 :)
  • 您添加了 OSGi 关键字,您在寻找 OSGi 答案吗?

标签: java jar osgi classloader embedded-resource


【解决方案1】:

jar 文件只是 zip 文件。因此,谷歌以如何读取 zip 文件为例。或者看看 API ZipInputStream

【讨论】:

    【解决方案2】:

    读取嵌入式资源最简单的选择是使用Class.getResourceClass.getResourceAsStream

    根据您的需要,我可以想出几种方法来实现这一点。

    com.me.Y.jar 添加到类路径中。您可以在系统级别(不是很推荐)或在命令行中执行此操作...

    java -cp com.me.Y.jar -jar com.me.X.jar

    编辑 有人指出,显然-cp 参数使用上面的命令被忽略了,但是,如果你包含主类,它将起作用...java -cp com.me.Y.jar -jar com.me.X.jar com.me.x.Main(例如)

    如果不方便,您可以将com.me.Y.jar 添加到com.me.X.jar manifest's class path,这将自动为您添加com.me.Y.jar

    如果你不能这样做,你可以使用URLClassLoader 直接加载com.me.Y.jar...

    URL[] urls = new URL[]{new File("/path/to/com.me.Y.jar").toURI().toURL())};
    URLClassLoader classLoader = new URLClassLoader(urls);
    URL resource = classLoader.findResource("/config/conf.txt");
    

    或者,如果您愿意,您可以使用java.util.JarFile 简单地打开罐子,但这看起来很像用核桃打开核桃...恕我直言

    【讨论】:

    • java -cp com.me.Y.jar -jar .. 指定-jar 时,将忽略-cp。去图吧。
    • !!真的……哎呀,太好了,一定是用罐子的清单代替,混蛋
    • 您仍然可以明确指定 main(& 类路径)。 java -cp com.me.Y.jar com.me.X.jar com.me.X.Main
    • @AndrewThompson(我使用#(即Class#getResource)的唯一原因是人们似乎认为它是静态引用;))
    • @AndrewThompson 我真的应该链接到文档,但实际上,如果人们不能进行谷歌搜索,那么我们所希望的:P
    【解决方案3】:

    获取网址的代码

    URL configURL = this.getClass().getResource("/config/conf.txt");
    

    Manifest.mfcom.me.X.jar

    Adding Classes to the JAR File's Classpath

    Main-Class: ...
    Class-Path: com.me.Y.jar
    

    【讨论】:

      猜你喜欢
      • 2011-01-15
      • 2012-04-27
      • 1970-01-01
      • 2013-12-08
      • 2011-01-24
      • 2015-04-21
      • 2016-12-29
      相关资源
      最近更新 更多