如何从复合JAR加载资源?

时间:2011-04-28 12:10:12

标签: java plugins jar classpath

我有以下问题:

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

一些背景

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

问题

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

我的想法

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

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

谢谢!


更新

我后来发现它确实是类路径的一个问题。如果我将复合库放在类路径上,一切都很完美。我现在遇到的问题是:

  1. 如果我将库复制到/Library/Java/Home/lib/ext/,它可以正常工作。如果我使用java -cp "/path/to/plugins/myLib.jar" -jar Application.jar执行该应用程序,则无效。
  2. 如何将plugins目录中的所有jar加载到我的应用程序中,以便可以使用其中的资源?
  3. 再次感谢!

2 个答案:

答案 0 :(得分:1)

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

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

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

完美无缺。

答案 1 :(得分:0)

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

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

“我忘了:在JAR中添加依赖关系作为JAR是不可能的,因为它不适用于所有场景(例如,applet); IIRC也会像Eclipse一样使用未解决的类(read:runtime-)已解决的依赖关系。据我所知,还没有确定的方法可以在任何情况下优雅地处理嵌套的JAR。“

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