Supponiamo che abbia un'applicazione relativamente grande e complessa (100% di file .war
) con dipendenze multiple. Alcune parti del codice definiscono una fabbrica di oggetti, in cui oggetti simili (tutti ereditati dalla stessa classe base) vengono istanziati.
Il mio obiettivo è convertire questi oggetti hard coded in plugin che possono essere caricati dinamicamente in fase di esecuzione.
Quindi, ho scritto un caricatore di plugin:
String localPath = "...";
String pluginName = "...";
File jarFile = new File(localPath);
ClassLoader pluginLoader = URLClassLoader.newInstance(new URL[]{jarFile.toURL()});
pluginLoader.loadClass(pluginName).newInstance();
Poi ho iniziato a scrivere realmente i plug-in, che è il momento in cui mi sono reso conto che ogni potenziale plugin ha un gran numero di dipendenze e la creazione di un file jar per ciascuno di essi porterebbe a plug-in di circa 50 MB.
Sono preoccupato per i requisiti di memoria che questo comporterebbe, quando carico 100 di questi plugin.
C'è un modo per caricare plugin che dipendono da classi all'interno dell'app principale senza raggrupparli nel plugin stesso?
O come potrei condividere meglio tali risorse comuni?
[UPDATE]
Per ora ho pensato di esporre le classi già caricate alla ClassLoader
, che mi è stata detta funziona in questo modo:
ClassLoader mainLoader = PluginManager.class.getClassLoader();'
ClassLoader pluginLoader = URLClassLoader.newInstance(
new URL[]{jarFile.toURL()},
mainLoader);
Il lato negativo di questo è ovviamente che qualsiasi modifica nell'applicazione principale può far fallire i plugin. Questo, tuttavia, aiuterà con i miei problemi di memoria e con la corretta gestione degli errori sarà facile trovare plugin non più funzionanti.