2012-11-23 3 views
5

in un'applicazione Java che sto cercando di creare l'istanza della classe Class1 utilizzando newInstance() metodo nella classe. Class1 appartiene al mio progetto, ma richiede anche Class2 che proviene da un altro progetto e che si trova in un jar esterno che ho aggiunto al progetto e al percorso di build in Eclipse. Eclipse sembra trovare Class2 mentre compila il progetto senza alcun problema, ma quando provo a ottenere l'istanza di Class1 lancia una classe ClassNotFoundException su Class2.ClassNotFoundException in fase di esecuzione, ma l'applicazione compila

Questo è il modo in Class1 assomiglia:

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

e questo è come io cerco di ottenere l'istanza di esso:

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

E quando eseguo che ottengo:

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 

Un'altra cosa da aggiungere alla configurazione del mio progetto è che nella cartella WEB-INF ho una cartella chiamata libs con qualche ja rs e ho creato un'altra cartella lib chiamata libs_other_company e ho inserito il jar in cui si trova Class2. Se vado nel percorso di sviluppo java posso vedere il jar aggiunto nella scheda delle librerie.

Sto eseguendo l'applicazione in un server Tomcat direttamente da Eclipse (non sto utilizzando nulla come Ant o Maven).

Come può essere possibile che trovi la classe in fase di compilazione ma non in fase di runtime? Qualche idea per farlo funzionare?

Grazie.

+0

Sembra che dovrebbe già essere stato risolto qui. Non ho controllato, però. –

risposta

4

Si confondono due cose separate, si compila la risoluzione del percorso della classe di tempo e si esegue l'accesso al percorso della classe di tempo.

  1. Quando si compila la vostra applicazione, è necessario avere le classi che utilizza l'applicazione/si riferisce al vostro ambiente di sviluppo compilano percorso della classe; se non lo fai (fallo), allora si verificherà un errore di compilazione.

  2. Quando si esegue l'applicazione compilata, è necessario che tutte le classi utilizzate dall'applicazione/facciano riferimento nel percorso della classe JVM o incluse nel pacchetto dell'applicazione; se non lo fai (fallo), si verificherà un errore di run time.

Provate il secondo.

+2

So che questo è il problema. Non capisco perché eclipse non stia portando il vaso nell'ambiente di runtime. – Javi

+1

Poiché non lo fa per impostazione predefinita, devi "dirlo" quali classi/jar includere, altrimenti ogni applicazione dovrebbe contenere (quasi) tutte le classi. Solo ** tu ** saprai in che tipo di ambiente hai intenzione di eseguire la tua applicazione. Per questo motivo preferisco usare i file form di ant per confezionare le app. –

+0

quindi c'è un modo per configurarlo in Eclipse o devo creare uno script Ant per quello? – Javi