Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: Importare file jar

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    153

    Importare file jar

    Salve, qualcuno sa dirmi come importare file .jar a runtime?
    In pratica devo eseguire delle classi a runtime ma queste classi possono istanziare nei proprio metodi classi che sono contenuti in alcuni package, quindi se questi package non sono disponibili l'applicazione si chiuderà indicandomi l'errore, come posso fare quindi ad importare i file .jar che mi servono a runtime?Grazie per l'aiuto fin da adesso.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Importare file jar

    Originariamente inviato da prog
    Salve, qualcuno sa dirmi come importare file .jar a runtime?
    In pratica devo eseguire delle classi a runtime ma queste classi possono istanziare nei proprio metodi classi che sono contenuti in alcuni package, quindi se questi package non sono disponibili l'applicazione si chiuderà indicandomi l'errore, come posso fare quindi ad importare i file .jar che mi servono a runtime?Grazie per l'aiuto fin da adesso.
    Chiariamo bene la questione.

    Una cosa è una applicazione che referenzia e usa direttamente e in modo fisso classi presenti in un certo jar, quindi tale jar deve tassativamente essere in "classpath" (e come metterlo in classpath dipende .... se la tua applicazione è in un jar, la cosa più semplice è elencare i jar esterni necessari nel manifest).

    Un'altra è fare un qualcosa di più dinamico (nello stile dei "plug-in", per intenderci), del tipo: vedo se la classe X può essere caricata e se c'è allora la istanzio. O ad un livello ancora maggiore: vedo se nella cartella X esiste un jar Y e allora faccio in modo che il class loader possa usarlo per caricare delle classi.

    Sono tutte cose fattibili, quindi cosa vuoi fare di preciso?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    153
    Allora io devo creare una cosa dinamica, cioè ho un file xml dove stanno scritte delle classi da testare, ora queste classi possono referenziare altre classi contenuti in dei package jar anch'essi indicatemi nel file xml, quindi io per far funzionare in modo corretta la/le classe/classi devo allegare anche questi jar altrimenti le classi che testo mi daranno errore in quanto non trovano alcuni classi, ma i package che devo allegare non li consoco a priorio ma li devo importare a runtime.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da prog
    Allora io devo creare una cosa dinamica, cioè ho un file xml dove stanno scritte delle classi da testare, ora queste classi possono referenziare altre classi contenuti in dei package jar anch'essi indicatemi nel file xml, quindi io per far funzionare in modo corretta la/le classe/classi devo allegare anche questi jar altrimenti le classi che testo mi daranno errore in quanto non trovano alcuni classi, ma i package che devo allegare non li consoco a priorio ma li devo importare a runtime.
    Ok, già più chiaro. Quindi sia i nomi delle classi che i nomi dei file jar non li conosci a priori ma li determini a runtime elaborando un documento XML.

    Innanzitutto di suggerisco di documentarti sulla classe java.net.URLClassLoader che permette di caricare classi/risorse specificando un "search path" che può contenere riferimento a directory o a file jar.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    153
    Allora si la classe che mi hai detto fa proprio al mio caso in rete però ho trovato la seguete classe che dovrebbe importare un jar a runtime

    Codice PHP:
    package classloader;  
    import java.io.*; 
    import java.net.*; 
    import java.util.jar.*;   
    public class 
    MyJarLoader {    
       public static 
    void main(String[] argsthrows FileNotFoundExceptionIOException {    
           
    String jarName "/home/joaquin/Scrivania/Tirocinio/jfreechart-1.0.9/lib/servlet.jar"
           
    URLClassLoader urlLoader getURLClassLoader(new URL("file"nulljarName));      
            
    JarInputStream jis = new JarInputStream(new FileInputStream(jarName));     
            
    JarEntry entry jis.getNextJarEntry();     int loadedCount 0totalCount 0;      
            while (
    entry != null) {       
                 
    String name entry.getName();      
                 if (
    name.endsWith(".class")) {         
                                     
    totalCount++;        
                                     
    name name.substring(0name.length() - 6);        
                                     
    name name.replace('/''.');         
                                     
    System.out.print("> " name);           
                                     try {           
                                            
    urlLoader.loadClass(name);           
                                            
    System.out.println("\t- loaded");           
                                            
    loadedCount++;         
                                          } 
                                     catch (
    Throwable e) {           
                                         
    System.out.println("\t- not loaded");           
                                         
    System.out.println("\t " e.getClass().getName() +":"e.getMessage());        
                                     }         
                 }       
               
    entry jis.getNextJarEntry();     
             }       
            
    System.out.println("\n---------------------");     
            
    System.out.println("Summary:");      
            
    System.out.println("\tLoaded:\t" loadedCount);      
            
    System.out.println("\tFailed:\t" + (totalCount loadedCount));      
            
    System.out.println("\tTotal:\t" totalCount);           
            try {         
                 
    Object o=Class.forName("javax.servlet.FilterConfig").newInstance();     
             } catch (
    InstantiationException e) {         
                   
    // TODO Auto-generated catch block         
              
    e.printStackTrace();     } 
             catch (
    IllegalAccessException e) {         
                  
    // TODO Auto-generated catch block         
                   
    e.printStackTrace();     } 
              catch (
    ClassNotFoundException e) {         
                 
    // TODO Auto-generated catch block         
                 
    e.printStackTrace();     }   
              }      
          private static 
    URLClassLoader getURLClassLoader(URL jarURL) {     
              return new 
    URLClassLoader(new URL[]{jarURL});   
          } 
        } 
    ma in pratica quando creo un'istanza della classe mi dice ClassNotFoundException.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da prog
    Allora si la classe che mi hai detto fa proprio al mio caso in rete però ho trovato la seguete classe che dovrebbe importare un jar a runtime

    Codice PHP:
    package classloader;  
    import java.io.*; 
    import java.net.*; 
    import java.util.jar.*;   
    public class 
    MyJarLoader {    
       public static 
    void main(String[] argsthrows FileNotFoundExceptionIOException {    
           
    String jarName "/home/joaquin/Scrivania/Tirocinio/jfreechart-1.0.9/lib/servlet.jar"
           
    URLClassLoader urlLoader getURLClassLoader(new URL("file"nulljarName));      
            
    JarInputStream jis = new JarInputStream(new FileInputStream(jarName));     
            
    JarEntry entry jis.getNextJarEntry();     int loadedCount 0totalCount 0;      
            while (
    entry != null) {       
                 
    String name entry.getName();      
                 if (
    name.endsWith(".class")) {
    .... 
    No tutto questo non ti serve. Non ti serve andare a lavorare direttamente sul jar (con JarInputStream), non ti serve esaminare le entry del jar.

    Ti servirebbe questo solo se tu dovessi fare statistiche sulle classi presenti nel jar (contare, verificare, ecc...), elencare i package delle classi nel jar o cose simili. Ma non è il tuo caso, mi sembra.

    Una volta che hai un URLClassLoader, invochi semplicemente il metodo findClass() passando il nome della classe (che determini come hai detto dal documento XML).
    Così ottieni un oggetto Class e con il Class beh, ci fai quello che vuoi, compreso istanziare un oggetto di quella classe oppure cercare/invocare costruttori/metodi/campi ... in una parola usare quella che si chiama "reflection".

    E qui viene il punto. Che cosa ci devi fare con la classe XYZ (di cui non sai il nome a priori)???
    Che cosa "sai"?? Devi istanziarla?? E devi invocare quali metodi??
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    153
    Allora ok son daccordo con te che non serve tutto ciò che è scritto all'interno della classe. Però una volta che io ho caricato la classe che mi serve, questa classe può creare istanze locali di altre classi all'interno dei metodi, ma io non so che tipo di oggetti creerà a priori, quindi oltre a creare un'istanza dela clsse devo importare cmq tutto il jar che contiene la classe, in modo che qualsiasi oggetto crei la classe sia disponibile e non abbia un'eccezione ClassNotFoundException. In pratica i jar che leggo dal file xml li devo importare e rendere disponibili con fosse un pacchetto della libreria standard Java. Cioè l'intero jar deve essere importato e utilizzabile.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da prog
    Però una volta che io ho caricato la classe che mi serve, questa classe può creare istanze locali di altre classi all'interno dei metodi, ma io non so che tipo di oggetti creerà a priori, quindi oltre a creare un'istanza dela clsse devo importare cmq tutto il jar che contiene la classe, in modo che qualsiasi oggetto crei la classe sia disponibile e non abbia un'eccezione ClassNotFoundException. In pratica i jar che leggo dal file xml li devo importare e rendere disponibili con fosse un pacchetto della libreria standard Java. Cioè l'intero jar deve essere importato e utilizzabile.
    Appunto. Dal tuo documento XML prima devi ricavare tutti i nomi dei jar necessari, poi li usi per ottenere un URLClassLoader. E quando farai ad esempio un findClass(), ammesso che tutti i jar necessari siano stati "collezionati", non ci saranno problemi a caricare classi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    153
    Originariamente inviato da andbin
    Appunto. Dal tuo documento XML prima devi ricavare tutti i nomi dei jar necessari, poi li usi per ottenere un URLClassLoader. E quando farai ad esempio un findClass(), ammesso che tutti i jar necessari siano stati "collezionati", non ci saranno problemi a caricare classi.
    Aspetta forse non mi sono spiegato bene, o non ho capito bene la soluzione.
    Facciamo che dal file xml devo importare i seguenti package A B e C e le classi da testare sono A.v, B.f
    allora io devo solo mandare in esecuzione A.v però io non so nei metodi di A.v queli tipi di oggetti possono essere creati, di un'unica cosa sono sicuro, che gli oggetti di A.v stanno in A la stessa cosa vale per la classe B.f, quindi io non posso fare nessun findClass, io mando solo in esecuzione A.v e poi tutti gli oggetti che crea A.v non sono sotto il mio controllo anche perchè io non so cosa crea A.v.

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da prog
    Facciamo che dal file xml devo importare i seguenti package A B e C e le classi da testare sono A.v, B.f
    allora io devo solo mandare in esecuzione A.v però io non so nei metodi di A.v queli tipi di oggetti possono essere creati, di un'unica cosa sono sicuro, che gli oggetti di A.v stanno in A la stessa cosa vale per la classe B.f, quindi io non posso fare nessun findClass, io mando solo in esecuzione A.v e poi tutti gli oggetti che crea A.v non sono sotto il mio controllo anche perchè io non so cosa crea A.v.
    Appunto. Non puoi sapere direttamente cosa la classe A.v userà in termini di altre classi.

    Si potrebbe solo scoprirlo andando a leggere e decodificare il "bytecode" della classe. Soluzione che non è proponibile primo perché avrebbe poco senso per quello che devi fare ma secondo, sopratutto, perché bisognerebbe avere una conoscenza dettagliata del bytecode Java.

    Da quanto hai detto, i nomi dei jar sono elencati nel documento XML. Se tutti i file jar sono quindi determinabili a runtime, non ti interessa sapere quali classi usano quali jar e in quali sono contenute. Ti basta solo prendere l'elenco dei file jar, usarlo per ottenere un URLClassLoader e quando farai un findClass() verrà risolto il tutto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.