1

私がやろうとしていて、何日もその方法を研究してきたのは、これが機能するために、フォルダーを調べてそこにあるすべてのjarを動的にロードするマザーjarを用意することです(実際にはそれらについて知る必要はありません)。というプラグイン内のファイルが必要ですplugin。現在、プラグインを起動できるワーキング クラス ローダーがありますが、ファイルを読み取ることができませんplugin

ここに私の現在のコードがあります:

Load.class

Load(JMenuBar Bar) {

ClassLoader currentThreadClassLoader = Thread.currentThread().getContextClassLoader();
        ClazzL = new URLClassLoader(new URL[]{new File("/home/grant/plugins/MenuPlugin.jar").toURL()}, currentThreadClassLoader);
        Thread.currentThread().setContextClassLoader(ClazzL);

        in = new BufferedReader(new InputStreamReader(ClazzL.getClass().getClassLoader().getResourceAsStream("/menuplugin/plugin")));

        System.out.println("in: " + in.readLine());


        Class c = ClazzL.loadClass("menuplugin.Main");//this works and loads properly
                                                      //it is just that it needs to
                                                      //load from `plugin` using
                                                      //in.readLine();
        API obj = (API) c.newInstance();
        obj.run(Bar);

}

エラーは(44行目:in = new Buffered ....)

Exception in thread "main" java.lang.NullPointerException
at menuaddon.Load.<init>(Load.java:42)
at menuaddon.Menuaddon.main(Menuaddon.java:39)
Java Result: 1

多くの助けに感謝

完成した作業コードは次のとおりです。

ClassLoader currentThreadClassLoader = Thread.currentThread().getContextClassLoader();
        ClazzL = new URLClassLoader(new URL[]{new File("/home/grant/plugins/MenuPlugin.jar").toURL()}, currentThreadClassLoader);
        Thread.currentThread().setContextClassLoader(ClazzL);
        in = new BufferedReader(new InputStreamReader(ClazzL.getResourceAsStream("plugin")));
        classpath = in.readLine();
        Class c = ClazzL.loadClass(classpath);
        API obj = (API) c.newInstance();
        obj.run(Bar);
4

3 に答える 3

4

ClazzL実際に変数であり、クラスローダーを参照している場合は、試してみてください

ClazzL.getResourceAsStream("/menuplugin/plugin")

代わりは。そうする場合、作成したクラスローダーではなく、クラスClazzL.getClass().getClassLoader()のクラスローダーからリソースをロードしようとしていますClazzL

于 2013-05-07T10:22:58.367 に答える
2
ClazzL.getClass().getClassLoader().getResourceAsStream("/menuplugin/plugin")

これは、 classloader からではなくClazzL、 URLClassLoader を定義するクラス ローダー (つまり、システム クラス ローダー) からロードされます。

試す

ClazzL.getResourceAsStream("/menuplugin/plugin")
于 2013-05-07T10:22:21.230 に答える