2016-04-01 5 views
0

In meinem Java-Projekt habe ich eine Klasse Person, die in zwei verschiedenen Gläsern mit dem gleichen Paketnamen (com.example.beans) existiert.Intellij/Tomcat: NoSuchMethodError

Das Problem ist, dass diese Klasse wie dies in jar1 definiert:

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

und in jar2:

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

Diese Klasse verwendet wird, richtig in das Projekt und IntelliJ beschwert sich nicht. Auf dem Server (tomcat 8) Inbetriebnahme, bekam ich folgende Fehlermeldung:

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

ich Tomcat Person von jar2 statt jar1 geladen vermuten.

Frage: Wie kann ich IntelliJ (Tomcat sagen) die richtige Klasse je nach Signatur laden?

Grüße.

+1

Sie sollten nicht zwei Klassen mit demselben Namen und demselben Paket in derselben Anwendung haben (obwohl sie in verschiedenen JARs enthalten sind). Benennen Sie eine der Klassen um oder fügen Sie sie in ein anderes Paket ein. – Jesper

+0

@Jesper Ihre Lösung ist sicherlich die logischste, aber da ich nicht verantwortlich für diese zwei Gläser bin, kann ich nicht. – DJey

+0

Verwenden Sie jemals die 'Person' Klasse von jar2? Wenn IntelliJ funktioniert, denke ich nicht. Wenn ja, benenne einfach jar2 oder jar1 um, um jar1 auf den Classpath zu setzen – tddmonkey

Antwort

1

Die Gläser sollten in den WEB-INF\lib Ordner der war Dateien platziert werden, auf diese Weise werden sie von verschiedenen Klassenladern geladen, und sie werden solche Probleme nicht verursachen.

Übrigens ist es eine schlechte Praxis, die Pakete in verschiedenen Jar-Dateien mit demselben Namen zu benennen. Eines der Hauptziele von Paketen ist der korrekte Namespace, und das ist alles andere als korrekt.

+0

Ich bin mir nicht sicher, ob das das Problem ist: IntelliJ setzt alle libs in das 'my_app_exploded/WEB-INF/lib' -Verzeichnis wo' jar1' und ' jar2' koexistieren. – DJey

+0

Nun, diese zwei Gläser sollten nicht im selben Krieg sein, da sie miteinander in Konflikt stehen. Die Klassennamen sollten nicht identisch sein. Sie können nicht zwei Klassen mit demselben vollständig qualifizierten Namen in einem einzigen ClassLoader laden, so funktioniert die JVM. – meskobalazs

Verwandte Themen