1

classLoader を使用して jar ファイルからクラスをロードしようとしていました。これが私のコードです:

private void loadJar(String path, String className) {

    try {

        File file = new File(path);

        if (!(file.exists())) {
            log.error("JAR File not found!");
            return;
        }

        String anUrl = "jar:file://" + file.getAbsolutePath() + "!/";
        URL[] urls = { new URL(anUrl)};
        URLClassLoader classLoader = new URLClassLoader(urls);

        System.out.println("className: "+className);
        Class aClass = classLoader.loadClass(className);

        if (!(isNullaryConstructor(aClass))) {
            System.out.println("Non nullary Constructor detected!");
            return;
        }

        Object anInstantiation = aClass.newInstance();

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } 
}

メインクラスのあるテストワークスペースで試しました。そして、それは機能します。

しかし、それを自分のプロジェクトに統合したとき。このエラーが発生しました:

java.lang.ClassNotFoundException

私はMavenを使用しています。依存関係に何かを追加する必要がありますか?

このコードで className が正しいことを確認するために、jar ファイルに存在するクラスをリストしました。

public static void main(String[] args) throws Exception {

    JarFile jf = new JarFile(new File(jarPath));

    Enumeration<JarEntry> e = jf.entries();
    while (e.hasMoreElements()) {
                    JarEntry entry = e.nextElement();
        System.out.println(entry.toString());
    }
    jf.close();
}

そして、私が入力した名前は正しかった。

助けてください!

ありがとうございました :)

4

1 に答える 1

0
  1. URLが間違っている可能性があります。file.toURI().toURL()代わりに試してください。!/または、 ;を削除します。標準のJavaクラスローダーはこの構文をサポートしていません。

  2. クラスの名前が間違っている可能性があります。完全修飾名(つまり、パッケージ名付き)、拡張子.なしで区切られた要素を使用していることを確認してください。.classの場合Stringjava.lang.String

于 2012-09-12T11:43:18.037 に答える