Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    6

    Package personali e CLASSPATH

    Salve a tutti, intanto essendo il mio primo messaggio mi presento, Luca, 21 anni, a Ottobre inizierò il terzo anno di ingegneria informatica

    Mi sono affacciato da pochissimo al mondo java, e ho un problema riguardo il classpath e l'importazione dei package personali (come da titolo). Premetto che compilo ed eseguo da terminale, SO windows 7.
    Ho creato un package (o meglio, copiato da un libro) per facilitare l'input da tastiera/file, dal nome "javagently", che contiene la classe "Text", e l'ho salvato in:
    C:\Users\Luca\programmazione\MyPackages
    Ho compilato la classe da terminale tramite l'opportuno comando javac e ora all'interno della cartella javagently sono presenti Text.class e Text.java. A questo punto nelle variabili d'ambiente, ho creato il CLASSPATH e inserito il percorso in cui si trova il package (dopo ho provato anche inserendo ".;" o "C:\;").
    Il programma che importa il package si trova in:
    C:\Users\Luca\programmazione\java
    e riporta la dicitura "import javagently.*".
    Dal prompt di comandi mi sposto nella suddetta cartella java, ma al momento della compilazione (javac programma.java) mi dice "package javagently does not exist". Cosa sbaglio?

    Grazie in anticipo a chi mi saprà aiutare!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    La struttura della directory dei sorgenti (e, poi, dei compilati) deve rispecchiare la struttura del package. Quindi, se la tua classe "Text" è dentro al package "javagently", allora il file Text.java deve essere posizionato dentro ad una directory che si chiama "javagently".

    codice:
    package it.mionome.pippo;
    ...
    public class Pluto{
       ...
    }
    Struttura di directory:
    codice:
    ...   // Quello che vuoi
    +--- it
    +--- +--- mionome
    +--- +--- +--- pippo
    +--- +--- +--- +--- Pluto.java
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    6
    Originariamente inviato da LeleFT
    La struttura della directory dei sorgenti (e, poi, dei compilati) deve rispecchiare la struttura del package. Quindi, se la tua classe "Text" è dentro al package "javagently", allora il file Text.java deve essere posizionato dentro ad una directory che si chiama "javagently".

    codice:
    package it.mionome.pippo;
    ...
    public class Pluto{
       ...
    }
    Struttura di directory:
    codice:
    ...   // Quello che vuoi
    +--- it
    +--- +--- mionome
    +--- +--- +--- pippo
    +--- +--- +--- +--- Pluto.java
    Ciao.
    Si infatti la mia classe Text è all'interno della directory chiamata javagently, ma non funziona comunque

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    6
    ok, risolto, potete chiudere (e bannarmi: ho modificato il classpath ma mi sono dimenticato di riavviare il prompt, e di conseguenza il prompt non vedeva la modifica)

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Se posso darti un consiglio... togli di mezzo la variabile d'ambiente CLASSPATH.
    Il CLASSPATH è un "parametro" che dovrebbe essere proprio di ciascuna applicazione, non di ciascun sistema operativo. Ciascuna applicazione ha il suo CLASSPATH (ed, infatti, viene impostato tramite un parametro all'avvio della JVM o all'interno del JAR dell'applicazione). Avere una variabile d'ambiente CLASSPATH, nella maggior parte dei casi, ti creerà solo problemi.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    6
    e nel mio caso specifico, per esempio, come faccio senza la variabile d'ambiente predefinita? Seguo volentieri il tuo consiglio ma sono totalmente inesperto in merito, come ho scritto nel primo post mi sono avvicinato a java da pochissimo. Grazie

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Se non c'è una variabile d'ambiente CLASSPATH impostata e se non è stata passata alcuna specifica per il CLASSPATH alla JVM allora l'applicazione cercherà le classi che le servono a partire dalla cartella corrente (ovvero, dalla cartella da cui viene avviata).
    Ciò significa che se tu esegui l'applicazione dalla stessa directory in cui c'è il file class di avvio e tutte i package che essa usa sono direttamente accessibili da tale directory, non hai bisogno di nulla.

    Faccio un esempio per chiarirmi: supponiamo che la mia classe principale si chiami "Start" e si trovi dentro alla directory "applicazione". Per semplicità tale directory NON costituisce parte di un package (se lo fosse dovremo agire in modo leggermente diverso, ma casomai lo vediamo poi). Di conseguenza, la classe Start non ha alcuna direttiva "package". Questa è la nostra classe Start:

    codice:
    import pkg.*;
    
    public class Start {
       public static void main(String[] args) {
          Pippo p = new Pippo();
          System.out.println( p.toString() );
       }
    }
    La classe Start fa uso della classe Pippo, la quale, al contrario, fa parte di un package chiamato "pkg". Questa è la banalissima classe Pippo:

    codice:
    package pkg;
    
    public class Pippo() {
       @Override public String toString() { return "Sono Pippo"; }
    }
    La classe Pippo fa parte del package "pkg", quindi deve essere all'interno di una directory chiamata "pkg". Se questa directory fosse all'interno della directory "applicazione" non hai alcun problema:

    codice:
    ... // quello che vuoi
    +--- applicazione
    +--- +--- pkg
    +--- +--- +--- Pippo.java
    +--- +--- Start.java
    Dal prompt dei comandi, mi sposto dentro la directory "applicazione" e da lì compilo ed eseguo:

    codice:
    C:\Programmi\applicazione> javac Start.java
    C:\Programmi\applicazione> java Start
    Nota che non ho dovuto compilare esplicitamente la classe Pippo: il compilatore si arrangia a trovarsela, esattamente come si arrangia a trovarsela l'esecutore java.

    E questo vale per qualunque package tu stia usando: se questi package sono direttamente raggiungibili dalla directory corrente (nel mio caso, dalla directory "applicazione") non hai bisogno di alcun CLASSPATH: questo perchè il classpath implicito è proprio la directory corrente... da lì parte la ricerca delle classi lungo i percorsi dettati dai package. La radice dei package, ovviamente, è la directory corrente. Quindi, se ho un package chiamato "pkg.components.listeners" allora devo avere nella directory corrente una sottodirectory chiamata "pkg", con all'interno una directory "components" con all'interno una directory "listeners".

    Se la directory "applicazione" fosse a sua volta un package (quindi, la classe Start facesse parte del package "applicazione") le cose cambierebbero e avresti diverse "configurazioni" in base alla situazione:

    1) Se il package "pkg" fosse un sottopackage di "applicazione" (applicazione.pkg), la struttura della directory rimarrebbe assolutamente la stessa

    2) Se il package "pkg" non avesse alcuna relazione con il package "applicazione", allora la directory "pkg" (e tutto il suo contenuto) dovrebbe essere portata fuori dalla directory "applicazione", quindi allo stesso livello.

    In ogni caso, per compilare ed eseguire dovresti posizionarti fuori dalla directory "applicazione" e specificare completamente il nome delle classi:

    codice:
    C:\Programmi> javac applicazione\Start.java
    C:\Programmi> java applicazione.Start
    Nota che javac vuole la notazione del percorso con il separatore di directory, mentre l'esecutore vuole il punto (come nei package). Anche in questo caso non ho alcuna necessità di compilare esplicitamente la classe Pippo poichè se la trova lui in automatico.

    Se tu hai la necessità di specificare un classpath (perchè alcune classi sono contenute all'interno di librerie non direttamente raggiungibili o all'interno di files JAR), allora hai a disposizione l'opzione "-cp" da riga di comando:

    codice:
    java -cp <elenco classi, files jar> NomeClasseDiAvvio
    L'elenco delle classi o files jar è un elenco separato dal separatore di directory (esattamente come se stessi specificando una variabile d'ambiente).

    Spero di averti dato un'infarinatura abbastanza completa.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    6
    tutto chiaro, sei stato gentilissimo ed esaustivo, grazie mille!

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