[英]Developing application with plugin support in Java
我一直在研究如何開發一個可以加載插件的應用程序。 到目前為止,我已經看到這可以通過定義一個接口來完成,並讓插件實現它。
但是,我當前的問題是如何在將插件打包到 Jars 時加載它們。 有沒有“最好”的方法來做到這一點?
我正在考慮的當前邏輯是獲取每個插件並在它們的 Jar 中查找實現接口的類。 但我不知道如何進行這樣的查找。 我認為這種邏輯可能不是一個好的邏輯,但是我找不到有關此特定主題的任何有用信息。
**Edit1:** 添加更多信息:預期的插件將是包含在主應用程序 Jar 所在子目錄中的 Jar 文件,如下所示:
應用程序文件夾
|- Main_Application.jar
|- 插件
|- Plugin1.jar
|- Plugin2.jar
|- Steve's_plugin.jar
等等。
我期望應用程序能夠在運行時加載文件夾內的所有插件。 所以在代碼中,它只會知道插件的文件夾應該存在,並且這樣的文件夾中應該有 Jars。
假設我有一個這樣的插件界面:
interface Plugin
{
public void run();
}
插件將由實現此類接口的類標識,如下所示
class Plugin1 implements Plugin
{
//attributes and other methods
@override
public void run()
{
//something happens here
}
}
class Plugin2 implements Plugin
{
//attributes and other methods
@override
public void run()
{
//something happens here
}
}
應用程序應該只編譯一次,並且能夠在執行時加載添加到文件夾中的任何插件。 為了使應用程序能夠加載任何插件,我是否需要對 Jar 的內容建立規則,例如包名和實現接口的類? 或者期望實現插件接口的類可以在 Jar 中的任何包中,並且具有任何名稱?
這是我想用這些插件做的事情的更通用的方法。 簡而言之,我計划構建一個具有選項卡的應用程序,每個插件都將提供每個選項卡的界面和功能。 我嘗試這樣做是因為我希望能夠分別維護每個選項卡,並且不想因為只對一個組件進行更改而根本不影響其他組件而重新編譯整個應用程序。
獲取插件 jar 列表:
File[] jars = new File("Plugins").listFiles();
然后,使用此答案中有關從 JAR 文件加載所有類的代碼,但對名稱以".jar"
結尾的jars
文件中的每個文件運行一次。 在循環體的底部,在
Class c = cl.loadClass(className);
繼續
if (Plugin.class.isAssignableFrom(c)) {
Plugin plugin = (Plugin) c.newInstance();
// And then, do something with the plugin here
}
我分享@Mifeet 對安全性的擔憂 - 您可能想要使用SecurityManager來限制插件代碼可以執行的操作。
很老的問題,但如果有人搜索仍然相關.. 添加到已接受的答案中,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.