Jar non funzionante su altro pc

di il
8 risposte

Jar non funzionante su altro pc

Buonasera a tutti,

prima i postare il problema premetto che ho letto vari post sull'argomento, ho letto bene anche quelli di anbin, ma non son riuscito comunque a venirne a capo.

Utilizzo Eclipse, ho inserito le librerie esterne all'interno di una cartella specifica chiama "librerie" situata all'interno della cartella principale del progetto. Su Eclipse, all'interno della schermata Build patch, tramite il pulsante ADD External Jar, aggiungo le librerie richiamandole dalla cartella "librerie".

Clicco su Export, Runnable Jar File e creo il mio Jar File perfettamente funzionante nel pc in cui è stato creato. Trasportandolo su un altro pc si avvia ma alcune funzioni (presenti all'interno delle librerie esterne) non funzionano.

Come posso fare?

Grazie per l'aiuto..

8 Risposte

  • Re: Jar non funzionante su altro pc

    Per prima cosa dovresti indicare che errore viene segnalato perche', come potrai ben immaginare, le possibili cause sono molte.

    Una delle cause piu' probabili, in mancanza di informazioni, ed e' un classico, e' la VERSIONE della Java Virtual Machine che viene utilizzata nei due sistemi.

    FONDAMENTALE comprendere che:
    1) Eclipse e' un EDITOR CON GLI STEROIDI, se vuoi, NON CENTRA MOLTO con la compilazione e l'esecuzione delle applicazioni Java che realizzi.
    2) Eclipse e' un'applicazione Java ma ANCHE QUESTO NON CENTRA NULLA con la compilazione e l'esecuzione delle applicazioni Java che realizzi.
    3) Eclipe installa una Java Virtual Machine, E QUESTO POTREBBE AVERE A CHE FARE la compilazione e l'esecuzione delle applicazioni Java che realizzi, nel senso che Eclipse, durante la configurazione, POTREBBE aver deciso di utilizzare la stessa JVM che usa per il suo funzionamento, ANCHE per compilare ed eseguire le applicazione Java

    Da questo punto di vista, E' COSA BUONA E GIUSTA SEPARARE completamente le JVM usare nei dua casi:
    a) Eclipse usa la sua, ma a te non interessa minimamente quale sia
    b) INSTALLI una JVM SPECIFICATAMENTE per la compilazione e l'esecuzione delle applicazioni Java che realizzi.

    questo ti permette di avere un TOTALE CONTROLLO su quale JVM stai utilizzando per la compilazione e l'esecuzione.

    Per eseguire la tua applicazione DEVI USARE la STESSA JVM OPPURE una versione successiva, su tutte le piattaforme, NON UNA VERSIONE PRECEDENTE.
    Se vogliamo, si potrebbe anche fare (usare una JVM PRECEDENTE a quella che hai usato per la compilazione), ma richiede esperienza per sapere come risolvere eventuali incompatibilita'.
  • Re: Jar non funzionante su altro pc

    Fasyrio ha scritto:


    Utilizzo Eclipse, ho inserito le librerie esterne all'interno di una cartella specifica chiama "librerie" situata all'interno della cartella principale del progetto. Su Eclipse, all'interno della schermata Build patch, tramite il pulsante ADD External Jar, aggiungo le librerie richiamandole dalla cartella "librerie".
    Se usi il pulsante "Add External JARs..." Eclipse "tira" dentro nel progetto un percorso "assoluto" al jar. Nulla di sbagliato in questo, di per sé, ma il progetto (e ripeto il PROGETTO, non il risultato del build) diventa non facilmente portabile su un altro pc.

    Se i jar esterni sono sotto il progetto (in una cartella "lib", "libs" o come ti pare chiamarla), allora usa l'altro pulsante "Add JARs..." perché questo ti permette di tenere nel progetto un percorso "relativo" al jar.

    Fasyrio ha scritto:


    Clicco su Export, Runnable Jar File e creo il mio Jar File perfettamente funzionante nel pc in cui è stato creato. Trasportandolo su un altro pc si avvia ma alcune funzioni (presenti all'interno delle librerie esterne) non funzionano.
    Detto così è un po' vago .... di quali "funzioni" parli? Quali sono queste librerie (non l'hai precisato)?

    Se hai un jar principale (la tua applicazione) e jar "esterni", quest'ultimi quando avvii la applicazione devono essere "in classpath". E per far questo ci sono diverse strade. Cosa hai fatto quindi? Conosci questi aspetti o no?
  • Re: Jar non funzionante su altro pc

    Grazie per gli interventi, cerco di rispondere:

    x migliorabile:
    - Purtroppo non ho implementato la funzione per la generazione dei Log, non ti so rispondere a questa domanda. Non mi viene fornito alcun messaggi di errore.
    - Le versioni delle JVM sono identiche in entrambe le macchine. Per sicurezza ho comunque disinstallato dalla seconda macchina la JVM ed effettuato il download e la reinstallazione alla versione piu recente. Per qui la Versione JVM macchina 2 (dove non funziona) > Versione JVM macchina 1 (Dove è stato generato il JAR), anche se le versioni dovessero differire ci dovrebbe essere retrocompatibilità.

    x anbin:
    - le librerie in questione sono: commons-net-3.6.jar e jaybird-full-2.2.13.jar entrambe dentro la cartella "libreria" interna alla cartella del progetto:


    ho provato a fare cosi come mi hai detto tu, ho riaperto il Build Path e ho utilizzato il pulsante ADD Jar; Il problema è saltato subito all'occhio in quanto nonostante i file siano fisicamente presenti, uno dei due manca all'appello all'interno della cartella quando cerco di richiamarli; non viene visualizzata una delle due librerie, esattamente la libreria jaybird-full-2.2.13.jar (Proprio quella dove sono contenute le istruzioni per le funzioni che non vanno)
    Se hai un jar principale (la tua applicazione) e jar "esterni", quest'ultimi quando avvii la applicazione devono essere "in classpath". E per far questo ci sono diverse strade. Cosa hai fatto quindi? Conosci questi aspetti o no?
    Questo purtroppo non mi è chiaro...
  • Re: Jar non funzionante su altro pc

    Fasyrio ha scritto:


    - le librerie in questione sono: commons-net-3.6.jar e jaybird-full-2.2.13.jar entrambe dentro la cartella "libreria" interna alla cartella del progetto:
    La commons-net non ha dipendenze (a parte JUnit per il testing). jaybird mai visto/usato ma da una veloce ricerca risulta essere il driver JDBC per il database Firebird.
    Ho scaricato il pacchetto completo e vedo che contiene delle librerie "native". Il documento di Release notes dice chiaramente: The Type 2 and embedded server JDBC drivers require the appropriate JNI library. Precompiled JNI binaries for Windows and Linux platforms are shipped in the default installation

    Quindi verifica come lo stai usando e se appunto devi usare quelle librerie native.
  • Re: Jar non funzionante su altro pc

    andbin ha scritto:


    The Type 2 and embedded server JDBC drivers require the appropriate JNI library. Precompiled JNI binaries for Windows and Linux platforms are shipped in the default installation
    Ho letto la documentazione, mi pare di aver capito (ma sinceramente non ne sono sicuro )che la JNI è una una libreria esterna che dovrebbe chiamarsi fbclient.dll. ho provato a scaricarla dalla rete ma non saprei dove inserirlo.

    Info aggiuntive: all'interno del codice il driver lo richiamo con le seguenti righe:
    
    import org.firebirdsql.management.BackupManager;
    import org.firebirdsql.management.FBBackupManager;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    	String databaseURL = "jdbc:firebirdsql:localhost/3050:"+path; 
    	String userDb= "SYSDBA";                     						
    	String passwordDb = "masterkey";									
    	String driverName = "org.firebirdsql.jdbc.FBDriver";
    
  • Re: Jar non funzionante su altro pc

    Fasyrio ha scritto:


    Ho letto la documentazione, mi pare di aver capito (ma sinceramente non ne sono sicuro )che la JNI è una una libreria esterna che dovrebbe chiamarsi fbclient.dll. ho provato a scaricarla dalla rete ma non saprei dove inserirlo.
    JNI innanzitutto è una specifica Java (non è una "libreria"). Questa specifica permette di invocare del codice nativo dentro una libreria nativa (.dll/.so/altro a seconda del SO) che deve essere scritta espressamente per rispettare tutta una serie di regole di JNI.
    Poi questa libreria per JNI può invocare altro: API del sistema, di altre librerie native, ecc...

    Da quanto letto (qui) la fbclient.dll/libfbclient.so è una libreria "client" generale per Firebird che fornisce una API usabile credo da più linguaggi (pure C, immagino). Quindi non mi pare che questa sia la libreria JNI.

    Le librerie native per JNI le ho trovate dentro lo zip che ho preso da qui.

    Non ti so dire, purtroppo, altro di più specifico o preciso.
  • Re: Jar non funzionante su altro pc

    Ora per scrupolo ho installato Eclipse nella seconda macchina, ho ricreato esattamente l'ambiente presente nella macchina uno, caricato le librerie esterne ecc..esportato il progetto e si presentano gli stessi problemi di prima, nonostante il JAR sia stato creato in locale dentro quella macchina.. boh boh..

    Comunque anbin grazie mille del supporto, sempre gentilissimo. Se dovessi mai riuscire a trovare una soluzione al problema la riporterò all'interno di questa discussione.

    Grazie e a presto!
  • Re: Jar non funzionante su altro pc

    @Fasyrio, non fare confusione ( ) e non inventarti risposte a casaccio!

    JNI NON E' una libreria, MA UNA SPECIFICA, cioe' delle regole su come legare Java a librerie scritte in C.

    Ci sono delle regole per mappare delle funzioni implementate in una libreria dinamica (la .DLL per Windows e la .SO per Linux) con metodi Java, e delle primitive per caricare dinamicamente la suddetta libreria.

    In pratica, seguendo la TUA terminologia, le .DLL/.SO SONO ESATTEMENTE LE LIBRERIE JNI di cui neghi il coinvolgimento.

    QUINDI:
    quando installi il driver JDBC per Firebird, NON INVENTARTI le risposte se le cose non funzionano! Spacchetta lo zip in una directory "lib" associata alla tua applicazione, dove metterai i jar DI TUTTE LE LIBRERIE CHE USERAI, quindi inizializza correttamente il "classpath", e vedrai che tutto funzionera' a dovere.

    Per fare tutto cio', NON USARE Eclipse, se non per la compilazione, MA USA UNO SCRIPT ".bat":

    - assicurati di avere l'ESATTA VERSIONE DI Java che vuoi usare nel PATH di windows OPPURE specifica nello script l'ESATTA VERSIONE DI Java che vuoi usare
    - INIZIALIZZA CORRETTAMENTE la variabile "CLASSPATH"
    - assicurati di conoscere ESATTAMENTE la classe che contiene il metodo statico "main"
    - manda in esecuzione il metodo "main", e lo si fa con qualcosa del tipo:
    
    	<path_Java>/bin/java.exe -classpath %CLASSPATH% <package>.<class_with_main> <altri argomenti>
    
    Ad esempio:
    
    	%JAVA8_HOME%\bin\java -classpath %CLASSPATH% org.hls.examples.Example1 1 2 3 4 5
    

    Se non hai capito che cosa e' il claspath, allora e' meglio che riparti dal tutorial di Java, perche' e' uno degli aspetti FONDAMENTALI della configurazione di un'applicazione Java: che cosa e' il classpath, che cosa e' il file .class, che cosa sono i file .jar, che cosa contiene un file .jar, ecc ...
Devi accedere o registrarti per scrivere nel forum
8 risposte