2012-11-23 12 views
5

In einer Java-Anwendung Ich versuche, die Instanz der Klasse Class1 unter Verwendung newInstance() Methode für die Klasse zu erstellen. Class1 gehört zu meinem Projekt, aber es braucht auch Class2, die von einem anderen Projekt ist und die in einem externen Krug befindet, die ich dem Projekt und dem Build-Pfad in Eclipse hinzugefügt habe. Eclipse scheint Class2 zu finden, da es das Projekt ohne Probleme kompiliert, aber wenn ich versuche, die Instanz von Class1 zu bekommen, wirft es eine ClassNotFoundException über Class2. DieseClassNotFoundException in Laufzeit, aber die Anwendung kompiliert

ist, wie Class1 wie folgt aussieht:

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 
     ... 
    } 
} 

und das ist, wie ich versuche, die Instanz davon zu bekommen:

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); 
} 

Und wenn ich ausführen, dass ich bekommen:

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 

Eine andere Sache, die über meine Projektkonfiguration hinzuzufügen ist, dass ich unter WEB-INF-Ordner einen Ordner namens libs mit einigen ja habe rs und ich haben einen weiteren lib-Ordner namens libs_other_company erstellt und dort das jar platziert, in dem Class2 ist. Wenn ich zum java-Build-Pfad gehe, kann ich das jar auf der Registerkarte libraries sehen.

Ich benutze die Anwendung in einem Tomcat-Server direkt von Eclipse (ich verwende nichts wie Ant oder Maven).

Wie kann es sein, dass die Klasse zur Kompilierzeit gefunden wird, aber nicht zur Laufzeit? Irgendeine Idee, damit es funktioniert?

Danke.

+0

Es sieht so aus, als hätte es hier schon gelöst werden sollen. Habe das aber nicht überprüft. –

Antwort

4

Sie verwechseln zwei separate Dinge, kompilieren Zeit Klassenpfad Auflösung und Laufzeit Klassenpfad Zugriff.

  1. Wenn Sie Ihre Anwendung kompilieren, müssen Sie Klassen haben, die Ihre Anwendung/bezieht sich auf in der Entwicklungsumgebung Klassenpfad kompilieren; Wenn Sie dies nicht tun, wird ein Fehler bei der Kompilierung auftreten.

  2. Wenn Sie Ihre kompilierte Anwendung ausführen, müssen Sie alle Klassen haben, die Ihre Anwendung in Ihrem JVM-Klassenpfad verwendet/bezieht oder in Ihrem Anwendungspaket enthalten ist; Wenn Sie dies nicht tun, wird ein Laufzeitfehler auftreten.

Sie erleben die zweite.

+2

Ich weiß, dass das das Problem ist. Ich verstehe nicht, warum Eclipse das Glas nicht zur Laufzeitumgebung bringt. – Javi

+1

Da es dies nicht standardmäßig tut, müssen Sie "sagen", welche Klassen/jar eingeschlossen werden sollen, andernfalls müsste jede Anwendung (fast) alle Klassen enthalten. Nur ** Sie ** wissen, in welcher Umgebung Sie Ihre Anwendung ausführen möchten. Aus diesem Grund bevorzuge ich Ameisenbau-Dateien, um die Apps zu verpacken. –

+0

Also gibt es eine Möglichkeit, das in Eclipse zu konfigurieren, oder muss ich dafür ein Ant-Skript erstellen? – Javi

Verwandte Themen