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

    Importare dinamicamente jar

    Salve,
    Per un progetto avrei bisogno di importare dinamicamente dei jar o file .class .
    Dato che sono molto interessato alle performance dell'applicazione, volevo sapere se il fatto di importare delle classi a runtime piuttosto che inserirle nel classpath poteva portare a una riduzione di prestazione ?

    Eventualmente, quale sarebbe il modo migliore di importare i jar nel codice, sempre avendo come obbiettivo quello di massimizzare la prestazione?

    Grazie in anticipo
    Federico.

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    che? sicuro di quello che hai scritto? il classpath indica DOVE il class loader andrà a cercare le classi che vengono richieste, non significa che vengano subito caricate. Le classi vengono SEMPRE caricate runtime, il primo avvio è sempre quello più rognoso perché deve trovare il jar e fare il caricamento. Se tu credi di accedere 100 volte ad una stessa classe, allora le prestazioni non verranno penalizzate dal classloader perché 1 accesso prevede il caricamento, 99 accessi sono rapidi che la classe è già in memoria.
    Se accedi a 100 classi di 100 librerie differenti...boh in tanti anni non mi è mai successa una roba del genere.
    Infine, se ti interessano le prestazioni e anche i millesimi fanno la differenza, penserei seriamente a cambiare linguaggio, visto che con java passi cmq da una vm ed è sempre leggermente più lento di altri linguaggi che non hanno questo passaggio (es. c++)
    RTFM Read That F*** Manual!!!

  3. #3
    Quote Originariamente inviata da federico.massim Visualizza il messaggio
    Salve,
    Per un progetto avrei bisogno di importare dinamicamente dei jar o file .class .
    Dato che sono molto interessato alle performance dell'applicazione, volevo sapere se il fatto di importare delle classi a runtime piuttosto che inserirle nel classpath poteva portare a una riduzione di prestazione ?

    Eventualmente, quale sarebbe il modo migliore di importare i jar nel codice, sempre avendo come obbiettivo quello di massimizzare la prestazione?

    Grazie in anticipo
    Federico.
    Normalmente quello che faccio e' creare un loader, cosi' da mettere i jar/class che voglio caricare in un file di proprieta' e caricarli all'avvio dell'applicazione.
    Pero' ovviamente potrei caricare questi file in qualsiasi altro momento, ad libitum

    codice:
        private URLClassLoader addJars(Properties props) throws MalformedURLException
        {
            int jarCount = Integer.parseInt(props.getProperty("jarfiles.count"));
            URL[] vectURL = new URL[jarCount];
            for (int i = 0; i < jarCount; i++)
            {
                String filename = props.getProperty("jarfile" + (i+1) + ".filename");
                URL u = new File(filename).toURI().toURL();
                vectURL[i] = u;
            }
    
            URLClassLoader loader = new URLClassLoader(vectURL);
            return loader;
        }
    Ti ritorna un class loader che puoi usare per istanziare le classi che ti interessano.
    Le prestazioni ovviamente non cambiano rispetto a mettere i .jar nel CLASSPATH

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Quote Originariamente inviata da sottovento Visualizza il messaggio
    Le prestazioni ovviamente non cambiano rispetto a mettere i .jar nel CLASSPATH
    non confondente il loader con il concetto di classpath.
    Il class loader è l'elemento a cui viene chiesto di CARICARE all'interno della JVM la classe che a te serve.
    Il classpath è il percorso all'interno del quale il classloader va alla ricerca dei jar di interesse. Tipicamente è una stringa con una serie di path a directory in cui ci sono n jar distinti.
    Quando parli di mettere i jar e caricarli, stai dicendo in un linguaggio molto molto naturale che a PRIORI fai il caricamento di una classe contenuta in un jar che sta nel classpath all'interno della JVM, non che metti fisicamente qualcosa dentro qualcos'altro.
    RTFM Read That F*** Manual!!!

  5. #5
    Quote Originariamente inviata da valia Visualizza il messaggio
    non confondente il loader con il concetto di classpath.
    Cerchero' di non confonderlo

    Quote Originariamente inviata da valia Visualizza il messaggio
    Il class loader è l'elemento a cui viene chiesto di CARICARE all'interno della JVM la classe che a te serve.
    Il classpath è il percorso all'interno del quale il classloader va alla ricerca dei jar di interesse. Tipicamente è una stringa con una serie di path a directory in cui ci sono n jar distinti.
    Quando parli di mettere i jar e caricarli, stai dicendo in un linguaggio molto molto naturale che a PRIORI fai il caricamento di una classe contenuta in un jar che sta nel classpath all'interno della JVM, non che metti fisicamente qualcosa dentro qualcos'altro.
    Non ho molto capito. Ad ogni modo credevo che la domanda di federico.massim fosse chiara: ho un .jar che non e' nel CLASSPATH e la mia applicazione per esempio vuole eseguire del codice ivi contenuto. Il .jar e' fornito runtime e potrebbe essere diverso ad ogni esecuzione. Come fare? Mi sono limitato a rispondere a questa domanda. Che poi, e' alla base del meccanismo dei plug in, giusto? (quanto meno faccio cosi', quando mi servono)

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Il principio ( anche coi plugin ) è lo stesso. Anche tu confondi i concetti: puoi caricarla quando ti pare, ma sempre nel classpath deve trovarsi. Se poi leggi, la domanda ( posta in questo modo ) non è nemmeno chiara

  7. #7
    Quote Originariamente inviata da valia Visualizza il messaggio
    Il principio ( anche coi plugin ) è lo stesso. Anche tu confondi i concetti:
    Staro' attento a non confondere i concetti

    Quote Originariamente inviata da valia Visualizza il messaggio
    puoi caricarla quando ti pare, ma sempre nel classpath deve trovarsi.
    No dai! Non deve trovarsi sempre e comunque nel classpath. Scusa, ma mi sembrava d'averlo dimostrato scrivendo un po' di codice, no?
    Usando quel codice puoi caricare un jar che sta in qualsiasi punto della rete, senza doverlo mettere nel classpath.

    Quote Originariamente inviata da valia Visualizza il messaggio
    Se poi leggi, la domanda ( posta in questo modo ) non è nemmeno chiara
    A me sembrava chiara. In effetti, e' probabile che federico.massim sappia gia' come caricare (anzi, rendere disponibile) le classi contenute in un .jar e chiedesse solo delle prestazioni. Ma una volta creato il loader ed usatolo al posto di quello di default (cioe' al posto di quello creato basandosi sul classpath) non ci sono differenze di prestazioni, il meccanismo e' lo stesso.

  8. #8
    Quote Originariamente inviata da sottovento Visualizza il messaggio
    Staro' attento a non confondere i concetti


    No dai! Non deve trovarsi sempre e comunque nel classpath. Scusa, ma mi sembrava d'averlo dimostrato scrivendo un po' di codice, no?
    Usando quel codice puoi caricare un jar che sta in qualsiasi punto della rete, senza doverlo mettere nel classpath.
    Ni.... Puoi caricare le classi che stanno nei jar che carichi usando quel ClassLoader, ma se provi a caricarli con il ClassLoader di default ovviamente ti becchi un ClassNotFoundException, appunto perchè non sono nel ClassPath fornito all'avvio dell'applicazione.

  9. #9
    Quote Originariamente inviata da francesco.muia Visualizza il messaggio
    Ni.... Puoi caricare le classi che stanno nei jar che carichi usando quel ClassLoader, ma se provi a caricarli con il ClassLoader di default ovviamente ti becchi un ClassNotFoundException, appunto perchè non sono nel ClassPath fornito all'avvio dell'applicazione.
    Esattamente! Quindi e' per questo che ho postato il codice per creare il ClassLoader

  10. #10
    Si ma ha ragione anche Valia, prima di tutto a dividere il loader con il classpath, e poi perchè Valia HA SEMPRE RAGIONE.....

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 © 2024 vBulletin Solutions, Inc. All rights reserved.