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

    javac - Classpath dinamico

    Premessa. Tutto quello che so sul tag "-classpath" di "javac" è questo:

    http://java.sun.com/javase/6/docs/te...classpath.html

    Ed ecco il mio problema.

    Ho una serie di pacchetti che sono sottocartelle della cartella principale del mio programma.

    codice:
    c:
    |---java
           |-----programma
                       |----------compila.bat
                       |----------pacchetto1
                       |----------pacchetto2
    Ho bisogno di creare il file di batch compila.bat in modo che vada a cercare i file da compilare anche nelle sottocartelle. Qualcosa del genere:

    codice:
    javac -classpath .;c:\java\programma\ filedacompilare.java
    Giusto?

    Ma se a compilare non fossi io e dovessi passare il programma con il file compila.bat a qualcun altro affinché lo esegua sul suo computer?

    E' ovvio che il percorso fisico sarebbe sbagliato.

    Come posso creare un percorso che vada bene sempre?

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

    Re: javac - Classpath dinamico

    Originariamente inviato da Iwk_Batterio
    Ho una serie di pacchetti che sono sottocartelle della cartella principale del mio programma.
    Sono pacchetti nel senso proprio dei "package" java??
    Cioè in un sorgente sotto pacchetto1 hai scritto:

    package pacchetto1;
    .....
    import .....
    ....

    Così??

    Originariamente inviato da Iwk_Batterio
    Qualcosa del genere:

    codice:
    javac -classpath .;c:\java\programma\ filedacompilare.java
    Giusto?
    Allora: se i due pacchetti sono proprio "package" di java, si dovrebbe avere in classpath la directory che contiene i package "radice" (nel tuo caso tale directory è c:\java\programma) e poi dare i comandi javac specificando di compilare pacchetto1\BlaBla.java ecc....
    Ma se hai svariati sorgenti e sparpagliati in diversi package può essere scomodo e noioso. Vedi allora la risposta sotto.

    Originariamente inviato da Iwk_Batterio
    Come posso creare un percorso che vada bene sempre?
    Allora ti suggerisco di usare Ant un tool free, opensource per il build, usato per progetti Java ma non solo.
    L'uso, almeno a livello basilare è abbastanza semplice e richiede solo la scrittura di un file XML che descrive le fasi di build. E c'è anche un mio esempio minimale ma completo di file di build in questo mio post.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Allora: se i due pacchetti sono proprio "package" di java, si dovrebbe avere in classpath la directory che contiene i package "radice" (nel tuo caso tale directory è c:\java\programma) e poi dare i comandi javac specificando di compilare pacchetto1\BlaBla.java ecc....
    Sì, sono proprio pacchetti.

    Ma se do da compilare un file .java non mi compila anche tutti gli altri file di cui ha bisogno?

    Comunque il problema è un altro (e da questo punto di vista non credo che Ant mi possa aiutare...): come faccio a creare un eseguibile .bat che compili il mio programma indipendentemente dal computer e dalla posizione fisica in cui si trova?

    (il computer di chi compilerà il programma non deve aver bisogno dell'installazione di nessun software)

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Iwk_Batterio
    Ma se do da compilare un file .java non mi compila anche tutti gli altri file di cui ha bisogno?
    Nì (sì e no )
    La questione è questa: quando 'javac' compila un sorgente e scopre che c'è bisogno di altri "tipi" (detto in generale) referenziati e non presenti in quel sorgente, allora va alla ricerca. Può trovare il .class e/o il sorgente. Il comportamento di default (che si può cambiare con una opzione) fa scegliere quello più recente tra i due, se presenti entrambi. Quindi se il sorgente è più recente del .class, lo compila.

    Questo però vorrebbe dire che tu dovresti sapere che c'è una (o più) classe principale che dipende da tutte le altre classi. Allora basterebbe compilare questo sorgente principale e javac scopre e compila tutto ciò che gli serve.
    Ma questo ovviamente non sempre è vero ... dipende dal tuo progetto. Ci possono essere dei casi in cui javac non saprebbe trovare il sorgente da compilare. Vuoi un esempio??

    Prova.java
    codice:
    public class Prova {
        private Altro a;
    }
    Test.java
    codice:
    public class Test { ..... }
    
    class Altro { ..... }
    In questo scenario, Prova ha bisogno di Altro (che è solo visibile in quel package ed è definito dentro Test.java, quindi supponiamo che magari serve solo a Prova e basta). Prova non ha bisogno di Test, perché magari è una classe che serve ad altre classi.

    Se compili solo Prova.java, javac non è in grado di "capire" che deve compilare il sorgente Test.java!!!
    Insomma, hai già capito: javac non è così "furbo"! Dovresti "saperlo" tu.

    Originariamente inviato da Iwk_Batterio
    come faccio a creare un eseguibile .bat che compili il mio programma indipendentemente dal computer e dalla posizione fisica in cui si trova?
    Con Ant ripeto che lo fai, e anche bene! Con i batch pure potresti farlo ma: a) non gestisci le dipendenze (ri)compila sempre tutto quanto! e b) Non sono "portabili". Una cosa è scrivere un .bat su Windows e un'altra è scrivere uno script per una shell es. la Bash su Linux. E quindi il tuo "indipendentemente dal computer" sarebbe da prendere con le pinze .... se uno vuole compilare il tuo programma Java su un S.O. Linux??
    Ant è portabile.

    Originariamente inviato da Iwk_Batterio
    (il computer di chi compilerà il programma non deve aver bisogno dell'installazione di nessun software)
    Ma il JDK deve comunque averlo, come minimo, innanzitutto!! E a quel punto scaricare lo zip di Ant, unzipparlo e settare quelle poche variabili di ambiente che servono ... come dicono gli americani, è una "brezza", una cosa facile, semplice.
    E tra l'altro ci sono centinaia di software opensource che per il build si basano su Ant. Mica ti danno un batch!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Ok, chiarissima la prima parte riguardo la compilazione di file .java. Visto che so a priori che pacchetto di file .java fornirò, posso provare a compilare il file principale e vedere se mi compila in automatico tutti gli altri file.

    Riguardo la seconda parte io ho la necessità di fornire un file .bat per la compilazione (su windows) e un makefile (per la compilazione su Linux)

    Dicevi che:

    Con i batch pure potresti farlo ma: a) non gestisci le dipendenze (ri)compila sempre tutto quanto
    Non importa che ri-compili sempre tutto quanto, mi basta che funzioni. La mia domanda è proprio come posso farlo. (E' ovvio che chi compilerà avrà JDK installato ma chi compilerà non deve scaricare altro. Non posso passargli altri file, tipo quelli di Ant. Deve avere solo un file .bat/makefile).

    Come lo creo in modo che non dipenda dal percorso fisico?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Iwk_Batterio
    Come lo creo in modo che non dipenda dal percorso fisico?
    Basta che si dica all'utente di stare sotto la directory "base" e poi i comandi (nel batch o makefile, è indifferente):

    codice:
    javac -classpath . blabla\sorgente1.java bloblo\sorgente2.java ....
    .....
    A parte la questione slash/backslash per i vari S.O. noti che dipende forse dal percorso fisico più "sopra" alla base? No.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Ok fammi capire la tua ultima riga di console:

    1) Il punto "." indica la cartella corrente (dove è lanciato il file .bat) giusto?

    2) Come mai non c'è uno slash dopo il "."?

    3) Come mai non devo separare i vari percorsi con un ";"?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Iwk_Batterio
    1) Il punto "." indica la cartella corrente (dove è lanciato il file .bat) giusto?
    Sì, il . in generale nei vari S.O. indica la "directory corrente"

    Originariamente inviato da Iwk_Batterio
    2) Come mai non c'è uno slash dopo il "."?
    Non servirebbe. Come non servirebbe in generale dopo un path ad una directory. Se fai il comando: CD C:\Temp o CD C:\Temp\ non c'è alcuna differenza.

    Originariamente inviato da Iwk_Batterio
    3) Come mai non devo separare i vari percorsi con un ";"?
    Nella opzione del -classpath c'è un solo "percorso" ... appunto solo il '.'
    Il resto non è una "lista" di percorsi unica come è il contenuto di PATH o CLASSPATH. I due sorgenti che ho elencato nell'esempio sono "argomenti" da passare a javac. E gli argomenti sulla linea di comando in generale si separano con spazi!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Sono riuscito a risolvere! Lo posto nel caso dovesse servire a qualcuno (così metto insieme anche una domanda...)

    codice:
    - progetto
    |------ classes
    |------ source
               |------- dacompilare.java
               |------- pacchetto1 (con dentro tanti file .java)
               |------- pacchetto2 (con dentor tanti file .java)
    |------ compila.bat
    Il file compila.bat deve compilare dacompilare.java che ha bisogno dei pacchetti "pacchetto1" e "pacchetto2" e deve mettere l'output in "classes"

    Ho trovato la riga corretta (dopo innumerevoli tentativi ):

    javac -d classes -classpath . source\dacompilare.java -sourcepath source

    Quello che non ho capito è perché devo mettere il puntino separato da spazio su -classpath visto che mi hai detto che classpath vuole un solo parametro...

    In sostanza quello che faccio è dire "usa la directory corrente come base" "da lì parti e compilare source\dacompilare.java" "usando i pacchetti che sono dentro la cartella source" "e metti l'output in classes". Giusto?

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Iwk_Batterio
    Ho trovato la riga corretta (dopo innumerevoli tentativi ):

    javac -d classes -classpath . source\dacompilare.java -sourcepath source
    Uhm ... non proprio.
    Se ti trovi in 'progetto' (dove c'è il bat), mettere come classpath '.' non serve. Mica è quella la directory dove ci sono i package "radice"!!! (sono classes e source che contengono i package "radice", cioè pacchetto1 e pacchetto2).

    E devi tenere presente che la directory che specifichi con -d non entra nel classpath. Mettendo solo -sourcepath (e con quel classpath . inutile) compila ma .... (ri)compila tutti i sorgenti sempre, ogni volta.

    La documentazione della Sun mi pare chiara sul punto -classpath e/o -sourcepath:

    If you set the -sourcepath option, the compiler searches the indicated path for source files; otherwise the compiler searches the user class path for both class files and source files.
    Originariamente inviato da Iwk_Batterio
    Quello che non ho capito è perché devo mettere il puntino separato da spazio su -classpath visto che mi hai detto che classpath vuole un solo parametro...
    Il classpath è una lista di file jar e directory. Es.:

    -classpath dir1;dir2\xyz;blabla.jar

    (questo su Windows. Su linux ci vuole : invece di ; e / invece di \ )

    Poi è ovvio che a javac vengono passati fisicamente 2 argomenti: uno "-classpath" e l'altro "dir1;dir2\xyz;blabla.jar"

    Ma ti è chiara la differenza tra gli argomenti, detto il più generale possibile, sulla linea di comando e una lista di file/dir che compone il classpath?
    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.