Se si dispone di una variabile statica a cui è assegnato un valore da una classe che utilizza un modello singleton, richiede in qualche modo che tutte le classi che potrebbero potenzialmente assegnare un valore a tale variabile statica vengano caricate?Quando esattamente una classe è stata caricata?
sto lavorando con il codice che assomigli a questo (semplificato per proteggere i dati aziendali):
private static DEVICE_FACTORY;
String factoryType = propertyFile.getDeviceFactoryType();
if(factoryType.equals("REAL"))
DEVICE_FACTORY = RealDeviceFactory.getInstance();
else
DEVICE_FACTORY = SimulatedDeviceFactory.getInstance();
Il codice per ogni tipo di fabbrica è nello stato completamente diversi progetti. La versione di produzione del jar dell'applicazione non contiene nessuna delle classi simulate. Il mio problema è che quando provo a testare il mio codice di produzione sto ottenendo "NoClassDefFoundError
" causato da "ClassNotFoundException
". Ho confermato che la proprietà è correttamente impostata su "REAL" quindi non ho idea del perché JVM stia tentando di creare/caricare le classi simulate ...
EDIT Proverò a creare una versione semplificata che mostri la problema domani. L'analisi dello stack (a cura ai dati aziendali protette) è la seguente:
java.lang.NoClassDefFoundError: my/package/SimulatedDeviceFactory
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.getMethod0(Unknown Source)
at java.lang.Class.getMethod(Unknown Source)
at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: my.package.SimulatedDeviceFactory
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Potrebbe essere che sto usando il pattern Singleton su ogni tipo di fabbrica dispositivo, pertanto, anche se io non ho intenzione di utilizzare il SimulatedDeviceFactory, perché sto usando una chiamata al metodo statico da quella classe, la JVM crede che sia necessario caricarla comunque?
Se questo è il caso potrei usare riflessione e un FQCN per risolvere tale abbastanza velocemente ...
È possibile ridurlo a un esempio che riproduce il problema? I dettagli contano davvero in un caso come questo, e il tuo codice non è valido (non puoi avere le dichiarazioni floating se in una definizione di classe) –
L'eccezione viene lanciata in quel ramo 'else'? – MxyL
Ti sei ricordato di mettere i file jar per gli altri progetti nel tuo classpath, ** right **? – Powerlord