我有以下问题:
我正在编写一个使用Netbeans平台中的一些JAR的应用程序。确切地说,我只使用Netbeans Visual Library来创建一些图形。这可以在不使用Netbeans平台的情况下通过从平台提取3个JAR来完成。除1个问题外,这一切都运作良好。
一些背景
我使用Java Simple Plugin Framework (JSPF)来处理我的插件管理。所以我有一个基本上由骨架框架组成的应用程序,然后根据它找到的插件JAR,它可以做各种事情,其中一个是绘制图形。这个功能的JAR插件里面有所有依赖库。这是通过将JAR导出为IntelliJ中的工件来完成的,它将unJAR所有依赖库并在其中重新编写它们(因此您需要的所有内容都在那里)。
问题
似乎正在发生的事情是,当它试图开始使用嵌入式库中的类时,它工作正常,但是当它需要资源时(特别是在我的情况下为.png),它抱怨它无法找到它。
我的想法
我唯一可以想到它为什么不起作用的原因是它可能是因为插件JAR不在类路径中。这可能是吗?
有没有在MANIFEST中指定一个类路径目录呢?否则我必须创建自己的ClassLoader
并手动加载插件目录中的所有JAR吗?
谢谢!
更新
我后来发现它确实是类路径的一个问题。如果我将复合库放在类路径上,一切都很完美。我现在遇到的问题是:
/Library/Java/Home/lib/ext/
,它可以正常工作。如果我使用java -cp "/path/to/plugins/myLib.jar" -jar Application.jar
执行该应用程序,则无效。再次感谢!
答案 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。“