【问题标题】:How to load a resource from compound JAR?如何从复合 JAR 加载资源?
【发布时间】:2011-04-28 12:10:11
【问题描述】:

我有以下问题:

我正在编写一个应用程序,它使用来自 Netbeans 平台的一些 JAR。确切地说,我只是使用 Netbeans Visual Library 来创建一些图表。这可以在不使用 Netbeans 平台的情况下通过从平台中提取 3 个 JAR 来完成。这一切都很好,除了 1 个问题。

一些背景

我正在使用Java Simple Plugin Framework (JSPF) 来处理我的插件管理。所以我有一个应用程序,它基本上由一个骨架框架组成,然后根据它找到的插件 JAR,它可以做各种事情,其中​​之一就是绘制图形。此功能的 JAR 插件包含它所有的依赖库。这是通过将 JAR 导出为 IntelliJ 中的工件来完成的,这将解压缩所有依赖库并将它们重新打包到您的库中(因此您需要的一切都在那里)。

问题

似乎正在发生的事情是,当它尝试开始使用 embedded 库中的类时,它可以正常工作,但是当它需要资源时(特别是在我的情况下为 .png),它抱怨找不到它。

我的想法

我唯一能想到它为什么不起作用的原因是,它可能是因为插件 JAR 不在类路径中。会是这样吗?

是否有可能在 MANIFEST 中指定一个类路径目录?否则我必须创建自己的ClassLoader 并手动加载插件目录中的所有 JAR 吗?

谢谢!


更新:

我随后指出这确实是类路径的问题。如果我将复合库放在类路径上,一切都会完美运行。我现在遇到的问题是:

  1. 如果我将库复制到/Library/Java/Home/lib/ext/,它可以正常工作。如果我使用java -cp "/path/to/plugins/myLib.jar" -jar Application.jar 执行应用程序,它就不起作用。
  2. 如何将插件目录中的所有 jar 加载到我的应用程序中,以便使用其中的资源?

再次感谢!

【问题讨论】:

    标签: java plugins jar classpath


    【解决方案1】:

    所以我终于弄清楚发生了什么。创建可执行 jar 时,MANIFEST.MF 文件会覆盖您在命令行中指定的任何类路径,如果您想指定外部 jar,这基本上会使它变得无用。这似乎是自 Java 1.3 以来已记录的普遍问题。

    我的简单解决方案是创建一个可执行的 jar,然后使用脚本启动应用程序:

    java -cp App.jar:plugins/* my.package.structure.App
    

    效果很好。

    【讨论】:

      【解决方案2】:

      默认的类加载器不会加载嵌套 jar 中的类。您需要编写自己的类加载器来获取嵌套 jar 中的类。

      你可以看看这篇jspf文章...

      “我忘了:在 JAR 中添加依赖作为 JAR 是不可能的,因为它不适用于所有场景(例如,小程序);如果您使用未解析的类(阅读:运行时-已解决的依赖项)。据我所知,目前还没有成熟的方法可以在所有情况下优雅地处理嵌套的 JAR。”

      http://code.google.com/p/jspf/wiki/UsageGuide

      【讨论】:

      • @nsfyn55 - 我想你误解了。 JAR 是 NOT 嵌套的。库 JAR 被提取到它们的目录结构中,然后包含在最终的 jar 中。最终产品是 1 个 JAR,没有嵌套的 JAR。它包含库中的实际类。
      • 你能发布一个 sn-p 来尝试从失败中检索 .png 和堆栈跟踪吗?
      • 我从未明确尝试访问该资源。库中的一个类(已提取)使用它在屏幕上绘制一个小部件。当它试图创建图像时,它会抛出一个 NPE。
      • 你能发布堆栈跟踪吗?您是否尝试过附加源并在故障行插入断点?
      • ...再次,我不能在那里设置断点。它发生在我没有源代码的编译类中。我通过在线浏览源代码查看了 NPE 发生的位置。当它尝试从 JAR 中的资源创建图像时会发生这种情况。我现在无法发布跟踪信息,今晚会发布。
      猜你喜欢
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 2013-01-16
      • 2014-10-11
      相关资源
      最近更新 更多