第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Java 從目錄中加載 jar 文件

Java 從目錄中加載 jar 文件

胡子哥哥 2022-09-14 17:59:05
我目前正在開發(fā)一個(gè)開源項(xiàng)目,人們可以添加自己的.jar來擴(kuò)展所包含的功能。但是,我一直堅(jiān)持如何在jar中加載類。我有一個(gè)抽象類,它有一個(gè)抽象方法和一些getter,它提供了一些對(duì)象來處理應(yīng)用程序。該插件需要子類我的插件類。jar應(yīng)該添加到/plugins中,因此我希望在應(yīng)用程序啟動(dòng)時(shí)加載/plugins文件夾中的所有*.jar文件。onEnable()BasePlugin我現(xiàn)在遇到的問題是,在我發(fā)現(xiàn)的所有方法中,我需要在jar文件中聲明類的類路徑,我不知道。我也不知道 jar 文件的名稱。因此,我需要掃描 /plugins 文件夾中的任何 *.jar 文件,并在實(shí)現(xiàn)和調(diào)用該方法的 jar 中加載相應(yīng)的類。BasePluginonEnable()
查看完整描述

4 回答

?
Smart貓小萌

TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊

基本思想也是...

  1. 讀取特定目錄中的所有文件

  2. 將每個(gè)結(jié)果的引用轉(zhuǎn)換為FileURL

  3. 使用與結(jié)果一起設(shè)定種子的 ,加載每個(gè)結(jié)果URLClassLoaderURL

  4. 用于查找具有特定名稱的所有匹配資源URLClassLoader#findResources

  5. 迭代匹配的資源并加載每個(gè)資源,這至少應(yīng)該給出“入口點(diǎn)”類名

  6. 裝入由“入口點(diǎn)”屬性指定的類

例如。。。

public List<PluginClass> loadPlugins() throws MalformedURLException, IOException, ClassNotFoundException {

    File plugins[] = new File("./Plugins").listFiles(new FileFilter() {

        @Override

        public boolean accept(File file) {

            return file.getName().endsWith(".jar");

        }

    });

    List<URL> plugInURLs = new ArrayList<>(plugins.length);

    for (File plugin : plugins) {

        plugInURLs.add(plugin.toURI().toURL());

    }

    URLClassLoader loader = new URLClassLoader(plugInURLs.toArray(new URL[0]));

    Enumeration<URL> resources = loader.findResources("/META-INFO/Plugin.properties");

    List<PluginClass> classes = new ArrayList<>(plugInURLs.size());

    while (resources.hasMoreElements()) {

        URL resource = resources.nextElement();

        Properties properties = new Properties();

        try (InputStream is = resource.openStream()) {

            properties.load(is);

            String className = properties.getProperty("enrty-point");

            PluginClass pluginClass = loader.loadClass(className);

            classes.add(pluginClass);

        }

    }

    return classes

}

nb:我沒有運(yùn)行這個(gè),但這是“基本”


查看完整回答
反對(duì) 回復(fù) 2022-09-14
?
天涯盡頭無女友

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊

SpigotMC也使用JAR文件作為插件,jar內(nèi)部是一個(gè)文件,用于存儲(chǔ)有關(guān)插件的額外信息,包括類路徑。您不需要使用 YAML 文件,而是可以使用 JSON 甚至純文本文件之類的文件。plugin.yaml

YAML 文件位于 jar 中,可以使用此處介紹的一些方法來訪問該文件。然后,您可以獲取類路徑屬性,然后使用此處介紹的方法加載 jar??梢源鎯?chǔ)有關(guān)插件的額外信息,例如名稱,版本和依賴項(xiàng)。


查看完整回答
反對(duì) 回復(fù) 2022-09-14
?
慕婉清6462132

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊

Java已經(jīng)有一個(gè)這樣的類:服務(wù)加載器。


服務(wù)加載器類是隨 Java 6 引入的,但“SPI jar”概念實(shí)際上與 Java 1.3 一樣古老。這個(gè)想法是每個(gè)jar都包含一個(gè)簡(jiǎn)短的文本文件,該文件描述了其特定服務(wù)提供者接口的實(shí)現(xiàn)。


例如,如果一個(gè).jar文件包含兩個(gè)名為 FooPlugin 和 BarPlugin 的 BasePlugin 子類,則該.jar文件還將包含以下條目:


META-INF/services/com.example.BasePlugin

該 jar 條目將是一個(gè)文本文件,包含以下行:


com.myplugins.FooPlugin

com.myplugins.BarPlugin

您的項(xiàng)目將通過創(chuàng)建一個(gè)從目錄中讀取的類加載器來掃描插件:plugins


Collection<URL> urlList = new ArrayList<>();


Path pluginsDir = Paths.get(

    System.getProperty("user.home"), "plugins");


try (DirectoryStream<Path> jars =

    Files.newDirectoryStream(pluginsDir, "*.jar")) {


    for (Path jar : jars) {

        urlList.add(jar.toUri().toURL());

    }

}


URL[] urls = urlList.toArray(new URL[0]);

ClassLoader pluginClassLoader = new URLClassLoader(urls,

    BasePlugin.class.getClassLoader());


ServiceLoader<BasePlugin> plugins =

    ServiceLoader.load(BasePlugin.class, pluginClassLoader);


for (BasePlugin plugin : plugins) {

    plugin.onEnable();

    // etc.

}

使用 ServiceLoader 的另一個(gè)優(yōu)點(diǎn)是,您的代碼將能夠與模塊一起使用,這是 Java 9 引入的更完整的代碼封裝形式,可提供更高的安全性。


查看完整回答
反對(duì) 回復(fù) 2022-09-14
?
哆啦的時(shí)光機(jī)

TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊

這里有一個(gè)例子,它可能會(huì)有所幫助。另外,你應(yīng)該看看OSGi。


查看完整回答
反對(duì) 回復(fù) 2022-09-14
  • 4 回答
  • 0 關(guān)注
  • 236 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)