Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Caricare dinamicamente un jar e invocarne metodi di una classe

    Salve a tutti! Devo realizzare un sistema a "plugin". Finora ho sviluppato tutto in un'unica applicazione, separando in package differenti le classi che andranno a costituire il mio plugin.
    Quindi nel flusso della mia applicazione principale ad un certo punto ho un a cosa del genere:
    codice:
    InputPlugin ip = new NomePlugin(parameters);
    Dove
    InputPlugin è un'interfaccia
    NomePlugin è il nome della classe che implementa quell'interfaccia
    parameters è un'istanza di tipo Map<String, String>

    Ora mi trovo a dover staccare questi plugin e metterli ognuno in differenti jar.
    Ed in effetti ho fatto così. A questo punto nella mia applicazione principale non potrò più avere un'istruzione come quella riportata precedentemente, ma il caricamento dovrà essere dinamico in base al nome del plugin che intendo caricare. Ho fatto come segue (ho trovato il codice in rete):
    codice:
    String inputPluginJarPath = "jar:file://" + inputPluginPath + "!/";
    ClassLoader inputPluginLoader = URLClassLoader.newInstance(new URL[] { new URL(inputPluginJarPath) });
    Class<?> myclassloader = inputPluginLoader.loadClass(inputPluginName);
    InputPlugin inputPlugin = (InputPlugin) myclassloader.newInstance();
    L'ultima istruzione mi dà però una InstantiationException, senza ulteriori informazioni.
    Ho creato anche un costruttore vuoto e senza parametri nella classe che dovrei caricare, ma senza risolvere nulla...
    In sostanza, come posso avere nella variabile inputPlugin un'istanza della classe di cui conosco il nome (e il relativo nome del jar che la contiene)?

    Grazie.

  2. #2
    L'ultima istruzione mi dà però una InstantiationException, senza ulteriori informazioni.
    Mi sembra impossibile che lo stacktrace di java ti dica solo questo, lo stack più piccolo che ho mai visto contiene almeno 5 righe....
    A parte questo,andando a tentoni, dato che il codice postato e sopratutto l'errore la classe viene correttamente caricata ma non riesce a costruire l'instanza.
    Sicuramente metodo newInstace prevede che in tale classe esista un costruttore di default (senza parametri) quindi controlla che questo esista e che tale classe sia correttamente inserita nel jar che stai tentando di caricare.

  3. #3
    RISOLTO
    Mi è bastato cambiare le seguenti righe... Da come mi sembra di capire il problema è la stringa del path del jar.
    codice:
    String inputPluginClassName = inputPluginPackage+"."+pluginName+"InputPlugin";
    File inputPluginJarFile = new File(inputPluginPath);
    ClassLoader classLoader = URLClassLoader.newInstance(new URL[] { inputPluginJarFile.toURI().toURL() });
    inputPlugin = (InputPlugin) classLoader.loadClass(inputPluginClassName).newInstance();
    inputPlugin.initialize(parameters);

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.