7

Java アプリケーションでは、クラスでnewInstance()メソッドを使用してクラスClass1のインスタンスを作成しようとしています。Class1 は私のプロジェクトに属していますが、別のプロジェクトからのもので、プロジェクトと Eclipse のビルド パスに追加した外部 jarにあるClass2も必要です。Eclipse はプロジェクトを問題なくコンパイルするため、Class2 を見つけたようですが、Class1 のインスタンスを取得しようとすると、 Class2 に関するClassNotFoundExceptionがスローされます。

Class1 は次のようになります。

import other.package.Class2;

public class Class1 implements Class1Interface{
    //there's no explicit constructor

    @Override
    public void method1(String param){
        System.out.println("Loading.....");
    }   

    @Override
    public void notifyChanges(String param) throws Exception{
        Class2 class2 = Class2.getInstance(); //here it's used the Class2 from another jar
        ... 
    }
}

そして、これは私がそれのインスタンスを取得しようとする方法です:

String myParam = "blabla";
Class1Interface interf = "my.package.Class1";
try {
    interf = (Class1Interface) Class.forName(interfazws).newInstance();
    interf.method1(myParam);
} catch (InstantiationException e) {
    handle(e);
} catch (IllegalAccessException e) {
    handle(e);
} catch (ClassNotFoundException e) {
    handle(e);
}

そして、それを実行すると、次のようになります。

Caused by: org.springframework.scheduling.quartz.JobMethodInvocationFailedException: Invocation of method 'execute' on target class [class my.package.myJobJob] failed; nested exception is java.lang.NoClassDefFoundError: other/package/Class2            
...
Caused by: java.lang.NoClassDefFoundError: other/package/Class2
...
Caused by: java.lang.ClassNotFoundException: other.package.Class2

私のプロジェクト構成について追加するもう1つのことは、WEB-INFフォルダーの下に、いくつかのjarファイルを含むlibsというフォルダーがあり、libs_other_companyという名前の別のlibフォルダーを作成し、そこにClass2が含まれるjarを配置したことです。ビルド パス ライブラリ タブに追加された jar を確認できます。

Eclipse から直接 Tomcat サーバーでアプリケーションを実行しています (Ant や Maven などは使用していません)。

実行時ではなくコンパイル時にクラスを見つけることができるのはどうしてですか? それを機能させるためのアイデアはありますか?

ありがとう。

4

1 に答える 1

6

コンパイル時のクラスパス解決と実行時のクラスパスアクセスという2つの別々のことを混同します。

  1. アプリケーションをコンパイルするときは、開発環境でアプリケーションが使用/参照するクラスをコンパイルクラスパスにする必要があります。そうしないと(そうしないと)、コンパイル時エラーが発生します。

  2. コンパイルされたアプリケーションを実行するときは、アプリケーションが使用/参照するすべてのクラスをJVMクラスパスに含めるか、アプリケーションパッケージに含める必要があります。そうしないと(そうしないと)、実行時エラーが発生します。

あなたは2番目を経験します。

于 2012-11-23T12:58:12.660 に答える