Compilazione classe per connessione DBOracle

di il
4 risposte

Compilazione classe per connessione DBOracle

Ciao a tutti,
ho un problema con la compilazione, da linea di comando, di una classe che utilizzo per la connessione ad un DB Oracle.

Il file .java è OracleJDBCSingleton.java che è contenuto nel package com.mm.databasemaster.jdbc, quindi il file fisicamente risiede in C:\mylib\com\mm\databasemaster\jdbc. Riesco a compilare la classe se mi posiziono nella cartella jdbc con il comando:
C:\mylib\com\mm\databasemaster\jdbc>javac OracleJDBCSingleton.java

e riesco anche ad eseguire posizionandomi nella cartella mylib con il comando:
C:\mylib>java com.mm.databasemaster.jdbc.OracleJDBCSingleton
solo che ricevo l'errore "java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver", questo perché non trova il driver ojdbc8.jar.

Ho provato ad inserire il jar nella mia cartella mylib ed ho provato ad eseguire il bytecode con il comando
C:\mylib>java -classpath ojdbc8.jar com.mm.databasemaster.jdbc.OracleJDBCSingleton
ma mi viene restituito l'errore "Errore: impossibile trovare o caricare la classe principale com.mm.databasemaster.jdbc.OracleJDBCSingleton"

ho provato anche inserendo nel classpath l'intera cartella mylib con il comando:
C:\mylib>java -classpath .\* com.mm.databasemaster.jdbc.OracleJDBCSingleton
ma niente, mi dice sempre impossibile trovare la classe principale.

La classe comunque è funzionante in quanto in eclipse riesco ad eseguirla avendo configurato nel buildpath il .jar contenente i driver, ma siccome vorrei capirci di più sulla compilazione "manuale" sto cercando di fare quanto sopra indicato.

Se può essere utile, non ho la variabile %CLASSPATH% impostata.

Grazie mille in anticipo come sempre, ciao.

Michele

4 Risposte

  • Re: Compilazione classe per connessione DBOracle

    charlesmm ha scritto:


    vorrei capirci di più sulla compilazione "manuale" sto cercando di fare quanto sopra indicato.
    C'è una cosa fondamentale da sapere (specialmente quando si vuole usare "a mano" i tools del JDK per compilazione/avvio): i nomi di package si devono SEMPRE "riflettere" nella struttura delle cartelle. Sia che siano "sfuse" nel file-system, sia che siano in un jar (che è strutturalmente uno zip).
    Questo vale ed è fondamentale per i .class generati, e dovrebbe valere anche per i sorgenti .java
    E l'altra cosa importante: la cartella (o jar) che contiene il package "radice" deve essere in "classpath".

    Se hai il sorgente Java in:

    C:\mylib\com\mm\databasemaster\jdbc\OracleJDBCSingleton.java

    (dove com\mm\databasemaster\jdbc è appunto la "riflessione" in cartelle del package com.mm.databasemaster.jdbc)

    E hai il ojdbc8.jar in

    C:\mylib\ojdbc8.jar

    Allora per compilare devi:

    a) posizionarti come directory corrente in C:\mylib
    b) eseguire

    javac -classpath . com\mm\databasemaster\jdbc\OracleJDBCSingleton.java

    Nota che un driver JDBC NON è di norma richiesto in classpath in compilazione. Le applicazioni di norma NON referenziano "staticamente" classi del driver. Il punto ( . ) in -classpath garantisce che in classpath ci sia C:\mylib (anche se nel tuo caso non servirebbe se hai 1 sola classe)

    Poi per avviare:

    java -classpath .;ojdbc8.jar com.mm.databasemaster.jdbc.OracleJDBCSingleton

    Nota che all'avvio serve avere in classpath il driver (ovviamente) ma ANCHE la directory C:\mylib perché la compilazione avrà generato il file

    C:\mylib\com\mm\databasemaster\jdbc\OracleJDBCSingleton.class
  • Re: Compilazione classe per connessione DBOracle

    Ciao Andrea,
    come sempre super esaustivo .

    Mi sono imbattuto nella compilazione manuale perché vorrei creare un file mylib.jar contenente la mia classe OracleJDBCSingleton (rispettando la path com\mm\databasemaster\jdbc) che come si può intuire utilizza il pattern Singleton per restituire una connessione al mio DB. Vorrei fare ciò per poter sfruttare tale classe in altri progetti e a questo punto mi chiedo, è possibile fare in modo di "accorpare" la mia classe con il driver jdbc8.jar.

    Quello che vorrei fare in pratica è potermi "portare dietro" solo il jar mylib.jar (che in qualche modo, se possibile, contiene il driver jdbc8.jar).

    Grazie ancora in anticipo, ciao.

    Michele
  • Re: Compilazione classe per connessione DBOracle

    charlesmm ha scritto:


    mi chiedo, è possibile fare in modo di "accorpare" la mia classe con il driver jdbc8.jar.
    Tecnicamente è di certo possibile. Con il tool jar del JDK non puoi importare da un altro .jar ma puoi aggiornare un jar esistente.
    La questione semmai è a livello di "licenza" (ammesso che tu debba/voglia rispettarla). Chi sviluppa una libreria (come potrebbe essere una di quelle più note o un driver JDBC, ecc...) potrebbe esprimere nella licenza il vincolo di non incorporare il contenuto del suo jar in un altro.
    Non so se è il caso del driver Oracle, potresti verificare.

    Comunque tecnicamente la prima cosa da fare è tenere separati i tuoi sorgenti dai compilati. In sostanza avere es.:

    C:\mylib\src\com\mm\databasemaster\jdbc\OracleJDBCSingleton.java

    e poi generare il class in:

    C:\mylib\bin\com\mm\databasemaster\jdbc\OracleJDBCSingleton.class

    Per fare questo usi l'opzione -d di javac

    Dopodiché copi il ojdbc8.jar in una cartella dandogli il nome es. my-ojdbc8.jar e poi con il tool jar e la sua opzione u (update) aggiorni quel jar con la tua classe.


    Finché questa cosa la fai una volta sola (o poco più) e basta, puoi anche farlo a mano. Se vuoi fare più cicli di sviluppo, anche in futuro, sulla tua classe e rifare tutta la procedura ti conviene forse automatizzare il processo gestendo questo "progettino" con Apache Ant oppure Apache Maven (o altro tool di build). Che chiaramente vanno imparati.
  • Re: Compilazione classe per connessione DBOracle

    Perfetto....

    Grazie mille ancora, ciao.

    Michele
Devi accedere o registrarti per scrivere nel forum
4 risposte