簡體   English   中英

如何從復合 JAR 加載資源?

[英]How to load a resource from compound JAR?

我有以下問題:

我正在編寫一個應用程序,它使用來自 Netbeans 平台的一些 JARs。 確切地說,我只使用 Netbeans 視覺庫來創建一些圖形。 這可以在不使用 Netbeans 平台的情況下通過從平台中提取 3 JARs 來完成。 這一切都很好,除了1個問題。

一些背景

我正在使用Java 簡單插件框架 (JSPF)來處理我的插件管理。 所以我有一個應用程序,它基本上由一個骨架框架組成,然后根據它找到的插件 JARs,它可以做各種事情,其中之一就是繪制圖形。 用於此功能的 JAR 插件內部包含所有依賴庫。 這是通過將 JAR 導出為 IntelliJ 中的工件來完成的,這將解壓縮所有依賴庫並將它們重新打包到您的庫中(因此您需要的一切都在那里)。

問題

似乎正在發生的事情是,當它嘗試開始使用嵌入式庫中的類時,它工作正常,但是當它需要資源時(特別是在我的情況下為 .png),它抱怨它找不到它。

我的想法

我唯一能想到它為什么不起作用的原因是,它可能是因為插件 JAR 不在類路徑中。 會是這樣嗎?

有沒有可能在 MANIFEST 中指定一個類路徑目錄? 否則我必須創建自己的ClassLoader並手動加載插件目錄中的所有 JARs 嗎?

謝謝!


更新:

我隨后指出這確實是類路徑的問題。 如果我將復合庫放在類路徑上,一切都會完美運行。 我現在遇到的問題是:

  1. 如果我將庫復制到/Library/Java/Home/lib/ext/它工作正常。 如果我使用java -cp "/path/to/plugins/myLib.jar" -jar Application.jar執行應用程序,則它不起作用。
  2. 如何將插件目錄中的所有 jars 加載到我的應用程序中,以便可以使用其中的資源?

再次感謝!

所以我終於弄清楚發生了什么。 創建可執行文件 jar 時,MANIFEST.MF 文件會覆蓋您在命令行中指定的任何類路徑,如果您想指定外部 jars,這基本上會使其無用。 這似乎是自 Java 1.3 以來已記錄的一般問題。

我的簡單解決方案是根本創建可執行文件 jar,然后使用腳本啟動應用程序:

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

效果很好。

默認類加載器不加載嵌套 jars 中的類。 您需要編寫自己的類加載器來獲取嵌套 jars 中的類。

您可以查看這篇 jspf 文章...

"I forgot: Adding dependencies as JARs inside JARs is not possible, because it would not work in all scenarios (eg, applets); IIRC also tools like Eclipse would have problems if you used classes with unresolved (read: runtime-resolved-dependencies ). 據我所知,目前還沒有成熟的方法可以在所有情況下優雅地處理嵌套的 JARs。”

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM