Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361

    [Java] Usare package (in particolare in cartelle di livello superiore)

    Salve a tutti, ho una domanda banale e non vorrei chiedere cose già chieste, ma dopo una ricerca in internet e qui sul forum ho trovato solo qualche domanda simile alla mia, ma che non risolve il mio problema.

    Per più di un anno ho evitato come la peste l'uso dei package, ora sto provando una libreria che ne fa uso e vorrei capirci di più,quindi mi sono creato un piccolo esempio .

    Preciso che il problema non si verifica quando devo richiamare una classe in una sottocartella, ma se devo collegare più classi in diverse cartelle, in particolare importare da una sottocartella una classe di una cartella a livello superiore.

    Ecco la struttura di directory creata:

    livello1
    ->Padre.java
    ->livello2
    ->Figlio.java
    ->livello3
    ->Nipote.java

    Quindi le tre directory sono in ordine livello1,livello2 e livello3 con i tre file Padre,Figlio e Nipote.
    Ecco come ho cercato di dichiarare e importare i package nelle tre classi:

    Padre.java:

    codice:
    package livello1;
    import livello1.livello2.Figlio;
    import livello1.livello2.livello3.Nipote;
    public class Padre
    {
        public static void main(String[] args)
        {
            Figlio f=new Figlio();
            Nipote n=new Nipote();
        }
    }

    Figlio.java:

    codice:
    package livello1.livello2;
    import livello1.Padre;
    import livello1.livello2.livello3.Nipote;
    public class Figlio
    {
        public static void main(String[] args)
        {
            Padre p=new Padre();
            Nipote n=new Nipote();
        }
    }

    Nipote.java:

    codice:
    package livello1.livello2.livello3;
    import livello1.Padre;
    import livello1.livello2.Figlio;
    public class Nipote
    {
        public static void main(String[] args)
        {
            Figlio f=new Figlio();
            Padre p=new Padre();
        }
    }


    Con le classi scritte in questo modo non compila niente, devo dire che ho provato diverse e diverse combinazioni, ma visto che non funzionava tutto ho riportato quello che a me pare il modo più logico di collegare i vari package.

    Spero che la soluzione non sia banale, ma davvero non riesco a farlo funzionare.Grazie a tutti per l'aiuto !

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Il codice è corretto e compila senza alcun problema.
    Come compili?

    Se compili da riga di comando è sufficiente posizionarsi fuori dalla directory "livello1" e dare il seguente comando, per far fare al compilatore TUTTO il lavoro:

    codice:
    $ javac livello1/Padre.java

    Il compilatore risolverà da solo tutte le "dipendenze" e compilerà tutto ciò che gli serve (trovando tutti i sorgenti).

    Stessa cosa per poter eseguire: si deve essere posizionati fuori dalla directory "livello1" e dare il nome della classe in modo completamente qualificato:

    codice:
    $ java livello1.Padre
    
    oppure
    
    $ java livello1.livello2.Figlio

    Ciao.
    Ultima modifica di LeleFT; 13-07-2015 a 14:24
    "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 L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Aggiungo solo che per fare i comandi detti da LeleFT, bisogna solo assicurarsi che in classpath ci sia (in modo relativo o assoluto) la directory in cui sei (ovvero la parente di livello1).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Il codice è corretto e compila senza alcun problema.
    Come compili?

    Io compilavo dentro la cartella "livello1", in realtà avevo anche provato a compilare da fuori ma l'avevo fatto quando funzionava in entrambi i casi quindi pensavo fosse uguale... Ora comunque funziona tutto


    Quote Originariamente inviata da andbin Visualizza il messaggio
    Aggiungo solo che per fare i comandi detti da LeleFT, bisogna solo assicurarsi che in classpath ci sia (in modo relativo o assoluto) la directory in cui sei (ovvero la parente di livello1).

    Non ho cambiato niente nel classpath , mi funziona perchè ho la variabile d'ambiente settata nel modo corretto ?


    Infine ho provato anche a creare il .jar per vedere se i collegamenti funzionano, ho creato fuori dalla directory livello1 il file manifest.txt (con la sola riga: Main-Class: livello1.Padre ) e creato il .jar (sempre dalla cartella padre di livello1) con il comando:


    jar cmf manifest.txt ProvePackage.jar livello1


    Il jar è creato e mi sembra funzionare (ho aggiunto una semplice stampa di una variabile), di solito essendo tutto nella stessa cartella specifico io i .class e la cartella di immagini da inserire, mentre stavolta ho in pratica "buttato dentro tutto"

    Grazie a entrambi !!
    Ultima modifica di Ansharja; 13-07-2015 a 15:01

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Non ho cambiato niente nel classpath , mi funziona perchè ho la variabile d'ambiente settata nel modo corretto ?
    Se non c'è la variabile di ambiente CLASSPATH, per default la directory "corrente" è in classpath.
    Se c'è la variabile di ambiente CLASSPATH, dovresti specificare o "." (senza apici) per indicare la directory corrente in modo relativo oppure il percorso assoluto alla parente di livello1.
    Se usi l'opzione -classpath blabla dei tools javac/java, la variabile CLASSPATH viene ignorata.


    P.S. semplice suggerimento: compilare "a mano" così, specialmente quando ci sono di mezzo i package è ovviamente un po' noioso. Va bene solo a livello didattico per avere chiaro il funzionamento. Se vuoi fare qualcosa di più realistico, o usi un IDE, oppure usi (anche "a mano" da console) dei tool di build come Ant o Maven.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Ora è chiaro, grazie di tutto

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.