2016-04-01 6 views
0

私のJavaプロジェクトでは、同じパッケージ名(com.example.beans)の異なる2つのjarファイルに存在するクラスPersonがあります。Intellij/Tomcat:NoSuchMethodError

class Person { 
    private String firstname; 
    private String lastname; 
    public Person(String firstname, String lastname){ 
     this.firstname = firstname; 
     this.lastname = lastname; 
    } 
} 

jar2に:

問題は、このクラスはjar1でこのように定義されていることである

class Person { 
    private int age; 
    public Person(int age){ 
     this.age = age; 
    } 
} 

このクラスのプロジェクトで正しく使用されているとのIntelliJは文句はありません。私はTomcatがjar2代わりのjar1からPersonをロード疑い

java.lang.NoSuchMethodError: com.example.beans.Person(Ljava/lang/String, Ljava/lang/String) 

: は、サーバー(Tomcatの8)起動時に、私は次のエラーを得ました。

質問:署名に応じて正しいクラス を読み込むようにIntelliJに伝えるにはどうすればいいですか?

よろしくお願いいたします。

+1

同じアプリケーション内に同じ名前で、同じパッケージ内に2つのクラスを持つことはできません(異なるJARに属しているにもかかわらず)。クラスの名前を変更するか、別のパッケージに入れます。 – Jesper

+0

@Jesperあなたのソリューションは確かに最も論理的ですが、私はそれらの2つの瓶を担当していないので、私はできません。 – DJey

+0

jar2から 'Person'クラスを使ったことはありますか? IntelliJがうまくいけば、私は推測していません。もしそうなら、jar2またはjar1の名前をクラスパスにjar1を最初に強制するようにしてください。 – tddmonkey

答えて

1

jarファイルは、warファイルのWEB-INF\libフォルダに配置する必要があります。そうすれば、異なるクラスローダーによって読み込まれるため、問題は発生しません。

ところで、同じ名前の異なるjarファイルでパッケージを命名するのは悪い習慣です。パッケージの主な目的の1つは正しい名前空間です。これは正しいものです。

+0

これは問題であるかどうかはわかりません:IntelliJはすべてのライブラリを 'my_app_exploded/WEB-INF/lib'ディレクトリに置きます。 jar2'が共存する。 – DJey

+0

さて、これらの2つの瓶は、互いに矛盾するので、同じ戦争にあってはなりません。クラス名は同じであってはなりません。 1つのClassLoaderで同じ完全修飾名を持つ2つのクラスをロードすることはできません。つまり、JVMの仕組みです。 – meskobalazs