Compilare java da linea di comando utilizzando l’opzione -classpath

manholdingquestionmarksmallcropped.jpgUna piccola guida, per chi come me, si è chiesto come riuscire a compilare dei sorgenti che richiedono delle particolari librerie (*.jar).

[compilazione tramite prompt su Windows]

Per completare la compilazione avete necessità di includere queste librerie nel classpath e TUTTI vi diranno, o vi hanno già detto, di andare a modificare la variabile d’ambiente %CLASSPATH% aggiungendo la nuova directory ove avete scaricato la libreria .Jar in questione..

..ma IO No!! Non voglio modificare questa variabile, la mia è nulla e nulla deve rimanere (per vedere il valore di tale variabile digitare sulla shell di win$ozz il comando echo %classpath%). Ci sarà pure un modo per indicare al compilatore dove racattare la libreria e includerla.. ma certo che c’è!!

Esempio: prendiamo questa libreria “Flanagan.jar” che ci offre numerose funzionalità matematiche e statistiche.
Salviamola da qualche parte, sul desktop, e poi scarichiamo anche i due sorgenti di prova: RegressionExampleOne.java e RegressionExampleTwo.java.
Salviamoli nella stessa direcory dove avevamo precedentemente salvato l’intera libreria.
Bene,
a questo punto possiamo procedere così:

  1. (aprite la linea di comando e digitate) javac -classpath ./flanagan.jar; RegressionExampleOne.java
  2. (e poi digitate ancora) java -cp ./flanagan.jar; RegressionExampleOne

Occhio a non dimenticare di mettere il punto e virgola !!

Come per magia vi appare un bel plot grafico ;)

Avreste potuto procedere anche in un altro modo, estraendo l’archivio .jar, posizionando i due sorgenti di prova all’interno e poi compilando ed eseguendo normalmente Java senza aggiungere null’altro..
..ma questo, diciamolo, non è un metodo molto elegante :)

Se le cose nn vi dovessero funzionare siete invitati a scrivermi, Vi aiuterò a risolvere il vostro problema, ma per favore non bestemmiatemi contro :mrgreen:

P:S: in ambiente Linux la procedura da seguire dovrebbe essere la stessa se non che dovete sostituire lo slash “/” con il back-slash “\”

12 Responses

  1. Ciao,
    ho letto con interesse il tuo quicktutorial in quanto sto’ cercando di installare delle librerie (Jena) con notevoli problemi. javac funziona, java mi da errore (immagino qualcosa sul classpath).
    Ho provato il tuo esempio, giusto per partire da qualcosa di didattico, ma anche qui ho un errore…
    Ho messo tutti i files del tuo tutorial nella cartella

    d:\progetti\test

    e non appena lancio:
    javac -classpath ./flanagan.jar; RegressionExampleOne.java il sistema mi segnala:

    “RegressionExampleOne.java:11: cannot access flanagan,analysis.Regression bad class file: flanagan.jar(flanagan/analysis/Regression.class) class file has wrong version 50.0, sould be 49.0
    Please remove or make sure it appears in the correct subdirectory of the classpath. [...]”

    a cosa può essere dovuto?

    il mio classpath, attualmente, è
    d:\progetti\ontologie;.;d:\progetti\ontologie\JENAROOT\lib

    Grazie per la disponibilità,
    Roberto Gatta

    • Salve,
      Io ho riprovato a seguire le indicazioni del mio articolo, scaricando nuovamente i suddetti file linkati (l’archivio .jar e i due file .java)
      e tutto mi funziona correttamente.
      Controlli la versione di java che ha installato:
      digiti nel prompt dei comandi

      java -version

      e poi prema Invio: a me compare la seguente dicitura

      java version “1.6.0_02″
      Java(TM) SE Runtime Environment (build 1.6.0_02-b06)
      Java HotSpot(TM) Client VM (build 1.6.0_02-b06, mixed mode, sharing)

      A Lei compare la stessa informazione, ovvero, anche lei ha installato java 6 ?

      Mi faccia sapere perchè la descrizione del suo errore mi ha fatto pensare subito ad un problema di incompatibilità che esiste nelle precedenti versioni della java virtual machine.
      (Incompatibilità con le nuove procedure di creazione dei file .jar)

  2. Ha visto giusto…
    java è alla versione 1.6.0_xx mentre javac era ancora nella versione 1.5.0.yy: scaricate le ultime Jdk, impostato il PATH alla nuova cartella ha funzionato tutto senza problemi.
    Spero ciò mi risolva il problema anche con le librerie Jena! :)
    Ad ogni modo, quando passa dalle parti di Brescia sappia di avere un debitore di un buon caffè!

    Grazie ancora e a presto,
    Roberto Gatta

    • Bene, speriamo che il problema sia tutto limitato ad un corretto utilizzo della versione piu- recente di java.
      Pi\ problematica potrebbe essere la situazione se tutto l-errore fosse dovuto ad una errata scrittura del codice presente nell-archio .jar> gi’ pi\ volte in passato mi [ capitato di dover correggere software @mal@ creato da altri> si sottrae tempo al proprio progetto.. il che non fa mai piacere..
      ..pazienza, cose che *spesso( capitano

  3. Bene.. cioe male. Sto notando che la ma tastiera non riesce pi\ a decifrare certi caratteri

    u accentata….\
    apostrofo….._
    tonda aperta….*
    asterisco….}

    ecc ecc
    il che [ molto male!!! …faccina arrabbiata…

    • Tutto risolto.. ieri sera avevo installato il programma UuSee (versione 2008) che deve avermi un po’ sballottato certi parametri di configurazione della lingua; questo programma (giapponese) ha pure corrotto il file Boot.ini, ma per fortuna il Bios -quando non trova questo file- prova a caricare il sistema operativo andandolo a cercare nella cartella di default “c:\ windows\”

  4. Salve,
    io ho installato la Jdk 1.6.0_12, ho modificato la variabile path aggiungendo il persorso alla cartella bin e infatti il compilatore javac funziona alla perfezione, solo che quando provo ad eseguire il programma scrivendo nel prompt java nomeclasse, non mi avvia il programma e mi scrive questo:

    http://img162.imageshack.us/img162/5641/immaginezzo.jpg

    Il programma è perfetto, senza nemmeno un errore, ne sono sicuro xkè lo ho fatto controllare a molte persone e anche xkè è un semplice printline….è tutto a posto ma non va….per di più’ sul pc di un mio amico lo stesso programma funziona…..
    Potresti aiutarmi a risolvere il problema??? Grazie mille in anticipo!!

  5. A prima vista semprerebbe un errore di tipo “case sensitive”
    ovvero:
    la tua classe si chiama “prova” (tutto in minuscolo) oppure “Prova” (con la sola prima lettera in maiuscolo) ?

    Java è case-sensitiva ovvero fa differenza tra stesse lettere scritte o in minuscolo o in maiuscolo.
    Il comando javac non è case-sensitive, mentre il comando java lo è: io credo che la tua classe si chiami in realtà “Prova.java” quindi puoi compilarla scrivendo “javac Prova.java” (o, tutto in minuscolo, “javac prova.java”)
    mentre per eseguirla devi scrivere per forza “java Prova”.

    Se mi sto sbagliando, se il nome della tua classe non è effettivamente “Prova” (con l’iniziale scritta in maiuscolo, come da convenzione per i nome delle classi) fammelo sapere.

    P.S: Ricorda che il nome della classe deve sempre essere uguale al nome del file..

    public class Prova {
    etc.. etc…

    tutto questo codice deve essere contenuto in un file chiamato anch’esso proprio “Prova.java”

    Occhio, quindi, alle maiuscole!!

    Fammi sapere se ci ho azzeccato o se ci sono altri problemi
    Ciao
    :)

  6. Ciao,
    grazie della risposta, ma il problema non è quello. il file si chiama prova.java e la classe prova.class, io per sicurezza e comodità non uso mai maiuscole programmando in java perchè come anche hai detto tu il comando java è key sensitive. ieri sera ho notato subito che andando nelle variabili d’ambiente ed eliminando la variabile classpath creata da me, funziona tutto correttamente senza problemi….l’unico problema è che non avendo la variabile classpath settata, non posso usare librerie esterne tipo prog.io che è fondamentale per il mio corso universitario….come possa fare?? Grazie ancora in anticipo!!

  7. Allora, c’è qualcosa che non va..
    ..mi spiego meglio:
    prendiamo la tua classe prova.java
    (fatti un piacere.. inizia ad usare la convenzione delle lettere maiuscole per i nomi delle classi; sembra una scemata, ma -credimi- ti tornerà utile)

    import prog.io.ConsoleOutputManager;

    public class Prova
    {
    public static void main(String[] args)
    {
    ConsoleOutputManager out =
    new ConsoleOutputManager();

    out.println(“Ciaoooooooo”);
    }
    }

    Bene.. questa classe fa uso di un’altra classe, la “ConsoleOutputManager” che troviamo nel package “prog-3d.jar” (libro “Dai fondamenti agli oggetti” di Pighizzini – Ferrari).
    Salviamo questo codice in un file chiamato “Prova.java”,
    per esempio sul Desktop.
    Sempre nella stessa directory salviamo anche il .JAR
    dopodichè apriamo il prompt dei comandi e scriviamo:

    cd Desktop
    [INVIO]

    javac -classpath ./prog-3d.jar; Prova.java
    [INVIO]

    java -cp ./prog-3d.jar; Prova
    [INVIO]

    Vedrete che, già in seguito alla digitazione del 2° comando
    (javac… ) la compilazione non avverrà per colpa di un’esattezza dello stesso archivio Jar.
    Avevo già lavorato con queste librerie, conoscevo il testo e lo stesso archivio relativo alla 2a edizione del libro non aveva nessun problema..
    ..infatti:
    scaricate la versione precedente di questo archivio .jar all’indirizzo:
    http://pighizzini.dico.unimi.it/jb/prog.jar

    e ripetiamo i passi precedenti:
    posizioniamo il file prog.jar nella stessa directory dove è presente il file Prova.java
    e, sul prompt, digitiamo:

    cd Desktop
    [INVIO]

    javac -classpath ./prog.jar; Prova.java
    [INVIO]

    java -cp ./prog.jar; Prova
    [INVIO]

    Stavolta tutto funziona correttamente.
    Se proprio volete/dovete usare le classi di questo preciso package (3a edizione) allora dovete scompattare l’archivio jar (usando WinRar) in una cartella sul Desktop,
    entrate in questa nuova cartella e copiate tutto il contenuto della cartella “prog” nella stessa directory del vostro sorgente Prova.java
    e poi
    stavolta i comandi da digitare saranno solo
    javac Prova.java
    java Prova

  8. Grazie mille ora funziona tutto!!! Il mio prof. (Mauro Ferrari, l’autore del libro) mi aveva accennato ad una soluzione del genere, ma era di fretta e non ha potuto spiegarsi bene….tu invece sei riuscito a risolvere il mio problema!! grazie mille!!!

    Ho visitato e letto quasi l’ intero blog e devo dire che lo trovo molto interessante!! Complimenti vivissimi!!!

  9. Ciao sono ancora io, ora sto programmando ad oggetti, ho creato una classe che voglio utilizzare in un’altro programma, la compilo e mi dà 0 errori…faccio l’altro programma, importo la classe creata prima e compilo…ecco il risultato:

    D:\Documents and Settings\Fabio\Documenti\Università\Programmazione Java\Programmi\ClassePersona\ProvaPersona.java:3: cannot access ClassePersona.Persona
    bad class file: D:\Documents and Settings\Fabio\Documenti\Università\Programmazione Java\Programmi\ClassePersona\Persona.class
    class file contains wrong class: Persona
    Please remove or make sure it appears in the correct subdirectory of the classpath.
    import ClassePersona.Persona;
    ^
    Procedura completata con codice di uscita 1

    Ho l’impressione che la classe la trova…ma che non riesca ad accedergli…sai come aiutarmi? Grazie in anticipo!

Leave a Reply