Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,514

    package differenti e classpath - utilizzare classi di terze parti

    Ciao ragazzi,
    sto iniziando a smanettare con java ma ho notato quella che per me è un'anomalia che non riesco a spiegarmi.

    ho definito la variabile di ambiente classpath indicando i seguenti percorsi

    .;c:/extjava/
    poi in una posizione diversa del disco ho il seguente codice

    codice:
    package com.ciromarotta;
    import java.util.*;
    import static net.mindview.util.Print.*;
    
    public class HelloDate {
        static public void main(String[] args){
            System.out.print(System.getenv("CLASSPATH"));
            print("Ciao oggi è: ");
            print(new Date());
        }
    }
    utilizzo l'sdk per compilare ma già in fase di compilazione ottengo l'errore che il package net.mindview.util non esiste.

    per compilare uso

    javac HelloDate
    se invece utilizzo

    javac -cp (percorsi di cui sopra) HelloDate

    tutto funziona correttamente e il codice viene compilato

    domanda 1:
    perché nonostante abbia settato la variabile classpath sono costretto ad usare cp?

    Stesso discorso per l'esecuzione
    se eseguo

    java nome della classe
    non funziona

    java -cp percorsi nome della classe
    funziona

    Altra domanda. File origine e compilato si trovano nella cartella src/com/ciromarotta

    perché debbo chiamare necessariamente il compilato da src usando

    java com.ciromarotta.Classe
    e non posso eseguire dalla directory

    codice:
    java Classe
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ok, quello che ho capito è che uno dei tuoi dubbi principali riguarda il "classpath". Il classpath è, detto in senso generale, un elenco di a) directory e b) file .jar (tecnicamente anche .zip ma non si usano di solito) che viene usato per rintracciare le classi (anche le risorse), perlomeno le "user classes", escludendo cioè le classi fornite di serie dal runtime e anche quelle di extension.

    Il classpath si può impostare in diversi modi, comunque alla fin fine se in classpath c'è es.:

    path1;file1.jar;path2

    e ad un certo punto è necessario rintracciare e caricare una classe es. com.esempio.Prova, allora il runtime Java converte il nome qualificato della classe in un percorso tipo com\esempio\Prova.class e va a cercarlo usando come "base" ciascuna delle directory/jar elencate in classpath.
    Questo in sostanza è il motivo per cui si dice che i nomi dei package devono sempre "riflettersi" nella struttura delle directory.

    Quindi verrà cercato:
    - esiste un path1\com\esempio\Prova.class ? Se no continua
    - esiste un com\esempio\Prova.class dentro file1.jar ? Se no continua
    - esiste un path2\com\esempio\Prova.class ? ......

    Tornando al tuo problema: se la tua classe è com.ciromarotta.HelloDate, allora ci deve essere un percorso X\com\ciromarotta\HelloDate.class e la cartella X deve essere referenziata (in modo relativo o assoluto) in classpath.
    Idem per tutte le classi/risorse in quel net.mindview. Se hai un jar che le contiene, il jar deve essere referenziato in classpath. Se sono "sciolte" sul file-system, la directory Y che contiene la "net" (di mindview) è quella da mettere anch'essa in classpath.

    Anche i sorgenti è bene che stiano sotto un percorso che riflette i nomi dei package. Quindi es.

    Z\com\ciromarotta\HelloDate.java

    Quando compili devi stare come directory corrente in Z e dare:

    javac com\ciromarotta\HelloDate.java

    Se non specifichi altro, il .class va a finire nella stessa directory del .java. E a questo punto la Z deve stare in classpath e a quel punto potrai dare:

    java com.ciromarotta.HelloDate

    Tutti gli esempi che ho fatto usano \ per Windows (e ; per il classpath). Per Linux è ovviamente / (e : per il classpath).

    Sono riuscito, nonostante l'ora tarda e un po' di stanchezza, a farti capire il concetto dei package/classpath?
    Ultima modifica di andbin; 14-06-2014 a 23:33
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,514
    bhe per cominciare grazie mille per la disponibilità...ma non è tardi gioca l'italia oggi...anzi domani

    Quindi vediamo. una volta creata l'applicazione, per farla funzionare su un pc diverso dal mio, devo inserire nel classpath tutti i percorsi delle classi? e per eseguire una classe debbo sempre riferirmi al suo nome esteso?

    Domani mattina faccio qualche test per verificare se ho capito (ehm ora basta studiare c'è l'itaglia )ma a prescindere se passi da qui pizza garantita per la tua gentilezza
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  4. #4
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,514
    hum non funge

    definito la variabile classhpath come segue

    .;C:\CLASSPATH\JAVA\TIJ4-code\;C:\CLASSHPATH\JAVA\TIJ4-code\net\mindview\util\
    in realtà avevo provato anche senza util. conclusione non trovo la classe. Per inciso dalla stessa applicazione chiamando e stampando la variabile di ambiente CLASSPATH ottengo la stringa riportata sopra.

    ma poi un'altra cosa. nella directory mindview esistono diversi . tre per la precisione. se in un'applicazione volessi usarli tutti e tre dovrei mettere ogni singolo path mella variabile d'ambiente?

    lo dice l'autore del libro che questa è la cosa più complicata di java
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da ciro78 Visualizza il messaggio
    lo dice l'autore del libro che questa è la cosa più complicata di java
    No ... non è così complicato. Basta che capisci il "succo" di tutta la questione package/classpath.

    Se c'è una classe con nome completamente qualificato: net.mindview.util.Print
    allora da qualche parte ci deve essere un percorso net/mindview/util/Print.class

    Dove "net", "mindview" e "util" sono appunto cartelle e Print.class è ovviamente il file .class generato da una compilazione di un sorgente.

    Ora: la cartella "net" potrebbe essere:
    1) dentro una cartella sul file-system, nel caso quelle classi non siano in un jar ma siano "sfuse" appunto nel file-system.
    Ad esempio in: C:\LibrerieJava\net\mindview\util\Print.class

    oppure

    2) dentro un jar, nel qual caso la cartella "net" deve essere alla "radice" del jar.
    Ad esempio in: C:\LibrerieJava\mindviewlib.jar

    In classpath va messa la cartella che contiene la "net" oppure il jar.

    set CLASSPATH=.........;C:\LibrerieJava;.......
    o
    set CLASSPATH=.........;C:\LibrerieJava\mindviewlib.jar;.......

    Ed è proprio tutto qui. Se hai compreso questo, riuscirai ad usare qualunque jar o insieme di classi.
    Ultima modifica di andbin; 15-06-2014 a 15:46
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,514
    eh allora ho capito bene...solo che non che non vuole funzionare....

    classpath è

    .;C:\CLASSPATH\JAVA\TIJ4-code\
    e li c'è appunto net e tutto il resto....
    solo che la classe non viene trovata
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da ciro78 Visualizza il messaggio
    eh allora ho capito bene...solo che non che non vuole funzionare....

    classpath è

    .;C:\CLASSPATH\JAVA\TIJ4-code\
    Quindi:
    - sotto C:\CLASSPATH\JAVA\TIJ4-code\ hai la net\mindview\......blabla.....
    - nella directory "corrente" (quale che sia lo sai tu) hai la "com" del tuo com.ciromarotta.HelloDate

    giusto? Se sì, avendo impostato la variabile CLASSPATH allora:

    java com.ciromarotta.HelloDate

    dovrebbe funzionare di certo. Idem se il classpath lo specifichi con l'opzione -classpath/-cp
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,514
    ma la classe la chiamo e funziona. quello che non funziona è l'utilizzo della classe net.mindview.....
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da ciro78 Visualizza il messaggio
    ma la classe la chiamo e funziona. quello che non funziona è l'utilizzo della classe net.mindview.....
    Scusa ma ... nel tuo HelloDate usi il Print di mindview. Quindi o la trova e funziona tutto oppure nemmeno la tua HelloDate parte.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,514
    si , intendevo dire che la classe funziona perfettamente senza mindview . mi stampa correttamente il classhpath ma non ne vuole sapere di trovare la classe net.minview
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


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.