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.
Sembra che dovrebbe già essere stato risolto qui. Non ho controllato, però. –