2015-11-27 30 views
0

我在這裏看過和更廣泛的網絡來找到解決方案。有相關的材料,但我一直無法找到有關我的具體問題的任何有用信息。在可執行jar中的類路徑設置似乎不適用於插件

我正在研究一些需要接受插件的Java軟件。我不想使用像OSGi這樣的花哨框架,而ServiceLoader似乎提供了正確的支持。我基本上已經工作了,但是在classpaths中遇到問題。我的目錄結構如下:

progfolder |___________ plugintest.jar |___________/plugins |________ plugin1.jar |________ plugin2.jar

如果我運行plugintest.jar與java -jar plugintest.jar那麼它沒有找到的講座即使我添加./plugins/插件(或這個變化)路徑:在清單中。閱讀表明,這隻適用於類,而不是罐子,所以我試圖直接在plugins內部的兩個插件的類中,並在其目錄的完整路徑,但沒有成功。

如果我使用-jar選項,我不允許添加-cp plugins/*來將plugins文件夾添加到類路徑中。爲了解決這個問題,我可以運行使用java -cp plugintest.jar;plugins/* com.plugin.test.Main,這可以按預期工作 - 兩個插件都可以通過代碼檢測到,但命令行有點笨拙,儘管我可以忍受它,如果這是最好的選擇。

我發現了另一個解決方案,我在plugins中創建了一個罐子類加載器,它適用於這種簡單情況,但是閱讀表明我可能遇到更復雜的應用程序中的安全問題。

有沒有辦法解決的事情,所以我可以簡單地運行與java -jar plugintest.jar而無需做我自己的類加載,或者這只是它的方式?

回答

0

好吧,至少有部分答案,以下是更多的實驗。畢竟,將類文件放在插件目錄中確實有效,但是您必須記住包含META-INF目錄和META-INF /服務。 services目錄中的文件必須包含對所有插件的引用。

如果有一個解決方案允許直接使用插件jar文件,但創建一個類加載器似乎是唯一的方法來做到這一點(至少我發現),這將是很好的,如前所述,這可能會導致安全問題。

0

上次我遇到類似的問題[1]。我發現Java文檔[2]答:

注:類Path頭指向本地網絡上的類或JAR文件,而不是JAR文件或類通過Internet協議訪問中JAR文件。要將JAR文件中的JAR文件中的類加載到類路徑中,您必須編寫自定義代碼來加載這些類。例如,如果MyJar.jar包含另一個名爲MyUtils.jar的JAR文件,則不能在MyJar.jar的清單中使用Class-Path標頭將MyUtils.jar中的類加載到類路徑中。

[1] https://github.com/narvi-blog/01-exec-jar#dependency-jar-files-within-an-executable-jar-are-not-so-easy
[2] https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

相關問題