Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Creare applicazione java con plugin

    Ciao!!

    Premetto che ho trovato un post già aperto su questo argomento, ma non lo riapro perchè è vecchio di circa due anni....

    Sto creando un'applicazione java che necessita di caricare dei metodi java da un file esterno, come se fosse un plugin!

    Mi spiego meglio...

    L'applicazione dovrebbe essere in grado di sostituire una sua funzionalità con una presente all'interno di un file che può essere caricato in real time.

    Ho letto della Classe "Class", ma non sono sicuro di aver capito bene come si usa...

    Codice PHP:
    Class = Class.forName(path_file
    Quanto scritto qui sopra serve a caricare la classe dal file in maniera tale che poi si possa agire su di essa scrivendo qualcosa del tipo:

    Codice PHP:
    valoreRestituito t.nomeMetodo(parametro1parametro2,...) 
    Ho capito bene oppure è arrivato il momento di chiudere tutto e andare a dormire???

    Grazie, ciao!!

  2. #2
    In pratica vuoi sapere come fare per caricare classi che non fanno parte del classpath.
    E' possibile usare un URLClassLoader per caricare classi in qualsiasi directory.
    Eccone un esempio pratico.

    Codice PHP:
        // Creare un oggetto File con il percorso del file contenente la classe
        
    String path "aFolder" File.separator "aFile";
        
    File file = new File(path);
        
        try {
            
    // convertire il File in un URL
            
    URL url file.toURL();          
            
    URL[] urls = new URL[]{url};
        
            
    // Creare un nuovo class loader 
            
    ClassLoader cl = new URLClassLoader(urls);
        
            
    // Caricare la classe; MyClass.class si dovrebbe trovare
            // nella directory file:/c:/myclasses/com/mycompany
            
    Class cls cl.loadClass("com.mycompany.MyClass");
        } catch (
    MalformedURLException e) {
        } catch (
    ClassNotFoundException e) {
        } 
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  3. #3
    Provo subito e ti faccio sapere!!!

    Grazie mille per la chiarissima illustrazione!!!



    Scusa la domanda, ma questo metodo mi permette di importare classi che ho scritto io? (quindi file testuali scritti da me)

    Dal Javadoc mi pare di capire che si possano importare solo classi precompilate appartenenti ad un eventuale jar...

    Dovrei compilare la mia classe prima di poterla utilizzare?

  4. #4
    La procedura standard per importare delle classi è quella di creare le classi, mettere in package directory e zipparli in formato jar per poi importarli con l'istruzione import.

    Se tu sai già che nella tua classe verranno usati i metodi di una classe allora devi seguire questa strada, ma se - come mi sembra di capire dal tuo caso - non sai che genere di classe dovrai andare a caricare, in quanto si tratta di un plugin, allora io userei la soluzione che ti ho proposto.

    Io non ho mai realizzato un plugin come lo stai intendendo tu, quindi vado per logica...sperando che funzioni
    Infatti se mi fai sapere come va mi fai un piacere, che son curioso

    Cmq si devi dare il .class quando vuoi riferirti alla classe da importare e non il sorgente
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  5. #5
    Risolto!!!

    Basta estendere la classe che mi hai segnalato tu e creare un'interfaccia comune per i plugin da inserire!!

    Posto il link migliore che ho trovato a riguardo!!

    http://mjoc.sig.lt/papers/java/JavaAppPlugin/

    Ancora una volta grazie mille del tuo aiuto!!!

    Ciao!!

  6. #6
    Ciao!!

    Dal link che ho riportato sopra ho preso la procedura per importare dei plugin in un mio programma java.

    Se non uso package, tutto funziona alla perfezione, ma appena aggiungo dei package non mi funziona più nulla...

    Il mio metodo che richiamo dalla mia classe (package com.poliba.pacman) è:
    Codice PHP:
        // read AI File
        
    public void loadAIFile(String fileName) {
            
    // CARICA IL PLUGIN
            
    int index;
            
    String className null;
            if ((
    index fileName.indexOf(".class")) >= 0)
            {
                
    className fileName.substring(0index);
                
                try
                {
                    
    // DA MODIFICARE INSERENDO LA CARTELLA PLUGINS
                    
    pluginLoader = new PluginClassLoader(".");
                }
                catch (
    Exception e)
                {
                    
    System.out.println("Errore pluginLoader: "+e);
                }
            }
            else if ((
    index fileName.indexOf(".jar")) >= 0)
            {
                
    className fileName.substring(0index);
                
                try
                {
                    
    pluginLoader = new PluginClassLoader(fileName);
                    
    System.out.println(pluginLoader.toString());
                }
                catch (
    Exception e)
                {
                }
            }
            else
            {
                
    System.out.println("WARNING: \""+fileName+
                                   
    "\" is not a plugin file, skipped");
                
    //continue;
            
    }
         
            
    // Loading the class
            
    try
            {
                
    plugin = (PluginInterface)pluginLoader.findClass(className).newInstance();
    //            confirm.setText("Loading complete!");
                
    this.AIFileLoaded true;
                
    System.out.println("Plugin caricato correttamente!");
            }
            catch (
    Exception e)
            {
                
    System.err.println("ERROR: Class \""+className+"\" could not be loaded");
                
    plugin null;
    //            confirm.setText("Error in loading file!");
                
    this.AIFileLoaded false;
                
    System.out.println("C'è stato un errore nel caricamento del plugin");
            }

    //-----------------------------------------------------------------------------------------            
            // Testing the class
    /*            if (plugin != null)
            {
                // Checking if succeeded to start
                if (plugin.start())
                {
                    System.out.println("Plugin infomation: "+plugin.getName()+
                                      " "+plugin.getVersion());
                    plugin.stop();
                }
            }
    */
    //-----------------------------------------------------------------------------------------
        
        

    Il link dice che con "pluginLoader = new PluginClassLoader(".");" si intende che i plugin devono trovarsi nella stessa cartella del progetto java...

    Credo che i problemi siano dovuti al package che inserisco per il plugin...le ho provate davvero tutte ma non trovo una soluzione...non mi carica affatto il file!!!

    Eppure senza package funziona....

    Qualcuno ha qualche idea?

    Grazie mille, ciao!

  7. #7
    Purtroppo sono stato costretto a cambiar percorso...non riesco a trovar soluzione a questo problema...

    Tornando a quanto proposto da matthew ho creato una classe che dovrebbe caricare una classe esterna:
    Codice PHP:
    package com.mypackage;

    import java.io.File;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLClassLoader;

    public class 
    Classe {

        
    /**
         * @param args
         */
        
    public static void main(String[] args) {
            
    // TODO Auto-generated method stub

            // Il mio file si trova nella sottodirectory diretta della home del progetto
            
    File file = new File("./plugins/Plugin.class");
            
            try {
                
    // Ho letto che è preferibile usare toURI().toURL() per convertire in URL
                
    URL url file.toURI().toURL();          
                
    URL[] urls = new URL[]{url};
            
                
    // Creare un nuovo class loader
                
    ClassLoader cl = new URLClassLoader(urls);
            
                
    // Caricare la classe
                
    Class cls cl.loadClass("com.mypackage.Classe");
            } catch (
    MalformedURLException e) {
                
    System.out.println("MALFORMED URL!!!");
                
    e.printStackTrace();
            } catch (
    ClassNotFoundException e) {
                
    System.out.println("CLASS NOT FOUND!!!");
                
    e.printStackTrace();
            }
        }

    Il plugin consiste nel seguente file:
    Codice PHP:
    public class Plugin implements PluginInterface
    {
        public 
    boolean start()
        {
            
    System.out.println(getName()+": starting...");
            return 
    true;
        }
        
        public 
    boolean stop()
        {
            
    System.out.println(getName()+": stopping...");
            return 
    true;
        }
        
        public 
    String getName()
        {
            return 
    name;
        }
        
        public 
    String getVersion()
        {
            return 
    version;
        }
        
        private final static 
    String name "The First Plugin";
        private final static 
    String version "0.0.1";

    con la seguente interfaccia:
    Codice PHP:
    public interface PluginInterface
    {
        public 
    boolean start();
        public 
    boolean stop();
        public 
    String getName();
        public 
    String getVersion();

    Plugin ed interfaccia non sono in alcun package, per evitare di crear altri problemi...

    Purtroppo però non riesco ad assegnare la corretta interfaccia alla classe...ho provato con:
    Codice PHP:
    try {
        
    plugin = (PluginInterface)cls.newInstance();
    } catch (
    InstantiationException e) {
        
    // TODO Auto-generated catch block
        
    e.printStackTrace();
    } catch (
    IllegalAccessException e) {
        
    // TODO Auto-generated catch block
        
    e.printStackTrace();

    ma mi dice che non è possibile effettuare il casting....qualcuno ha qualche idea?

    Purtroppo non ho trovato alcun esempio illuminante per i framework tipo JPF o MJPF, altrimenti avrei provato quella via....

  8. #8
    Ciao,

    ora purtroppo ho poco tempo ma ti risponderò con calma a presto.
    Vediti questo esempio intanto http://www.exampledepot.com/egs/java...loadClass.html
    più o meno è quello che hai fatto già ma magari ti può essere di aiuto non so.
    A presto appena o tempo
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  9. #9
    Ti ringrazio ancora una volta!!!

    Mi spulcio subito il tuo link sperando di non farti perdere altro tempo!!

    Grazie, ciao!!

  10. #10
    Ciao!!!
    Ho anche io il medesimo problema.
    La situazione è analoga: quando cerco di istanziare la classe caricata dinamicamente ed effettuare il cast mi dà errore di classCastException.

    Qualcuno mi può aiutare? pleeeeeeease... sto fondendo non ne esco fuori..

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.