Vai al contenuto

Mac e package e Java


AR89

Messaggi raccomandati

Allora dovrei creare un packge con java di questo tipo: poo.geometria, all'interno del quale dovrei mettere tutta una serie di classi riguardanti la geometria, in modo tale che ogni volta che vlgio fare un programma posso sfruttare le classi create in questo package.

La mia domanda è: come si crea un package su Mac (senza usare Eclipse)? Che sia sfruttabile da programmi normali come Xcode o TExtwrangler.

Altra domanda, su mac come si impostano le variabili ambientali?

Un Tetris in vecchio stile, dedicato alla versione per Mac degli anni 80.

Link al commento
Condividi su altri siti

No Nico. I package in Java sono un'organizzazione di classi ed interfacce logicamente correlate fra di loro... da cui puoi poi ricavare i .jar :ghghgh:

AR89 eclipse proprio ti fa schifo eh? E dire che basta un click con gli IDE, e automatizza praticamente tutto anche nella gestione poi.... vabbè... comunque basta semplicemente creare una cartella con quel nome, e le varie classi ed interfacce ce le metti li dentro. In ogni file, ovviamente, dovrai indicare in testa che appartiene a quel package, col comando:

package poo.geometria;

Se in una classe avrai bisogno di utilizzarne un'altra già scritta, dovrai aggiungere in testa il comando:

import package.nomeclasse;

Per compilare dal terminale, utilizza

javac *.java

da dentro la cartella del package, se no se hai degli import potrebbe tornarti errori perchè potrebbe non compilare tutte le classi che servono, ma solo quelle elencate da te.

Se sia sfruttabile da Xcode non ne ho idea. Ma ripeto... non vi fissate con questo ambiente perchè magari è della mamma Apple... è fantastico per obj-c ed altri, magari, ma per Java c'è molto ma molto di meglio...

Per le variabili d'ambiente consiglio di fare una ricerca sul forum: non so cosa ti serve in particolare, per cui non ti posso linkare con precisione, ma ho visto che c'è qualche discussione al riguardo.

Just when things went right, it doesn't mean they were always wrong

~

» Use Your Illusion «

Link al commento
Condividi su altri siti

Aggiungi che i JAR, partendo dalle cartelle, si possono ottenere con un comando da Terminale che è identico su qualsiasi piattaforma, poiché si tratta di un tool Java.

MacPro2,1 - 2 CPU Quad Core 3 GHz, 4 GB RAM, 2 HD 512 GB, Nvidia 8800 GT 512 VRAM, Apple Cinema Display 20'', Mac OS X 10.5.3, Xcode 3.1

MD5 Reader 2Galleria EnderCGSketchbookBlog cinema e FXGalleria (2000-2001)

Link al commento
Condividi su altri siti

No Nico. I package in Java sono un'organizzazione di classi ed interfacce logicamente correlate fra di loro... da cui puoi poi ricavare i .jar :rolleyes:

AR89 eclipse proprio ti fa schifo eh? E dire che basta un click con gli IDE, e automatizza praticamente tutto anche nella gestione poi.... vabbè... comunque basta semplicemente creare una cartella con quel nome, e le varie classi ed interfacce ce le metti li dentro. In ogni file, ovviamente, dovrai indicare in testa che appartiene a quel package, col comando:

package poo.geometria;

Se in una classe avrai bisogno di utilizzarne un'altra già scritta, dovrai aggiungere in testa il comando:

import package.nomeclasse;

Per compilare dal terminale, utilizza

javac *.java

da dentro la cartella del package, se no se hai degli import potrebbe tornarti errori perchè potrebbe non compilare tutte le classi che servono, ma solo quelle elencate da te.

Se sia sfruttabile da Xcode non ne ho idea. Ma ripeto... non vi fissate con questo ambiente perchè magari è della mamma Apple... è fantastico per obj-c ed altri, magari, ma per Java c'è molto ma molto di meglio...

Per le variabili d'ambiente consiglio di fare una ricerca sul forum: non so cosa ti serve in particolare, per cui non ti posso linkare con precisione, ma ho visto che c'è qualche discussione al riguardo.

Grazie per la spiegazione appena posso proverò a farlo, e farò sapere se ci sono problemi. Eclipse non posso usarlo perché il mio docente vuole che siamo noi stessi a creare ogni cosa.

Un Tetris in vecchio stile, dedicato alla versione per Mac degli anni 80.

Link al commento
Condividi su altri siti

Ecco i primi problemi, quando compilo da terminale ricevo il seguente errore:

host187-14-dynamic:~ antonioruffolo$ cd /poo/geometria

host187-14-dynamic:geometria antonioruffolo$ javac Punto.java

Punto.java:1: <identifier> expected

package.poo.geometria;

^

1 error

Questo è il codice che ho cercato di compilare, dov'è l'errore?

package.poo.geometria;
import java.util.*;
class Punto {
private double x,y;
public Punto() {
x=0;
y=0;
}
public Punto (double vx, double vy) {
x=vx;
y=vy;
}
public Punto (Punto p) {
x=p.x; y=p.y;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public void sposta (double nuovaX, double nuovaY) {
x=nuovaX; y=nuovaY;
}
public double distanza (Punto p) {
return Math.sqrt((p.x-x)*(p.x-x)+(p.y-y)*(p.y-y));
}
}//class Punto

Un Tetris in vecchio stile, dedicato alla versione per Mac degli anni 80.

Link al commento
Condividi su altri siti

Ecco un altro problema:

Questo è il codice della classe Punto che si trova nel package geometria

package poo.geometria;
import java.util.*;
class Punto {
private double x,y;
public Punto() {
x=0;
y=0;
}
public Punto (double vx, double vy) {
x=vx;
y=vy;
}
public Punto (Punto p) {
x=p.x; y=p.y;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public void sposta (double nuovaX, double nuovaY) {
x=nuovaX; y=nuovaY;
}
public double distanza (Punto p) {
return Math.sqrt((p.x-x)*(p.x-x)+(p.y-y)*(p.y-y));
}

public static void main (String args[]) {
       Punto p0= new Punto();
	Punto p1= new Punto(2,5);
	Punto p2= new Punto(-4,7);
	Punto p3= new Punto(p2);
       System.out.println("<"+p1.getX()+","+p1.getY()+">");
	p1.sposta(10,20);
	System.out.println("<"+p1.getX()+","+p1.getY()+">");
	double d13= p1.distanza(p2);
	System.out.println ("Distanza= "+d13);
	}
}//class Punto

e questo è l'errore che mi dà il terminale quando provo a eseguirlo:

host187-14-dynamic:~ antonioruffolo$ cd /poo/geometria
host187-14-dynamic:geometria antonioruffolo$ javac Punto.java
host187-14-dynamic:geometria antonioruffolo$ java Punto
Exception in thread "main" java.lang.NoClassDefFoundError: Punto (wrong name: poo/geometria/Punto)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:675)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:316)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:288)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:374)

Non capisco perché non funzioni, che significa quel ("NoClassDefFoundError)?

Un Tetris in vecchio stile, dedicato alla versione per Mac degli anni 80.

Link al commento
Condividi su altri siti

Ciao AR89

il tuo codice funziona, ho copiato e incollato su ambiente unix(server dell'azienda) e funziona benissimo su java 1.4

hai commesso un piccolissimo errore dato sicuramente da poca conoscenza del linguaggio java

generalmente si utilizza una cartella come radice di ogni lavoro quindi mettiamo il caso di un ambiente unix/lunux sia /work/user/progetto. quindi sotto la cartella progetto inizi a sviluppare il tuo programma.

quando crei un package effettivamente organizzi i tuoi sorgenti in gruppi funzionali omogenei. Devi quindi anche creare dalla cartelle e sottocartelle con i nomi dei package che pensi di utilizzare e dentro i file che stanno in quei package.

quindi nel tuo caso devi creare sotto /work/user/progetto/poo/geometria il file Punto.java (ricordati che java è case sensitive quindi minuscolo e maiuscolo fanno la differenza)

quindi da console devi ritornare sotto la radice del tuo progetto /work/user/progetto per poter eseguire il tuo codice

Per compilare non ci sono problemi puoi farlo nella directori stessa ma per essere eseguito devi essere OBBLIGATORIAMENTE nella cartella radice del progetto

quindi nel tuo esempio tornando nella radice del progetto (/work/user/progetto) per compilare devi fare :

javac poo/geometria/Punto.java

Per eseguire il tuo codice

java poo/geometria/Punto

tecnologicamente dipendente

Link al commento
Condividi su altri siti

Grazie mille ora funziona perfettamente, il fatto è che prima programmavo con Xcode e faceva tutto lui, ora invece ho bisogno del Terminale.

È da questa settimana che programma in Java usando gli oggetti quindi ancora devo capire molte cose, appena avrò altri problemi vi farò sapere.

Un Tetris in vecchio stile, dedicato alla versione per Mac degli anni 80.

Link al commento
Condividi su altri siti

ma per essere eseguito devi essere OBBLIGATORIAMENTE nella cartella radice del progetto
Vero solo se si invoca Java esclusivamente in quel modo. È possibile invocare Java passando il CLASSPATH come opzione in modo che cerchi nella directory radice e quindi invocare il main da qualsiasi altro posto.

MacPro2,1 - 2 CPU Quad Core 3 GHz, 4 GB RAM, 2 HD 512 GB, Nvidia 8800 GT 512 VRAM, Apple Cinema Display 20'', Mac OS X 10.5.3, Xcode 3.1

MD5 Reader 2Galleria EnderCGSketchbookBlog cinema e FXGalleria (2000-2001)

Link al commento
Condividi su altri siti

Vero solo se si invoca Java esclusivamente in quel modo. È possibile invocare Java passando il CLASSPATH come opzione in modo che cerchi nella directory radice e quindi invocare il main da qualsiasi altro posto.

come si passa il classpath e in particolare a chi si passa?

Mi spiego meglio: ho creato il packge /poo/geometria e al suo interno ho messo delle classi.

Quando però provo a importarlo scrivendo import poo.packege.*; mi dice che non lo trova. Su Windows il compilatore riesce a trovarlo usando il classpath, su mac come s'imposta?

Un Tetris in vecchio stile, dedicato alla versione per Mac degli anni 80.

Link al commento
Condividi su altri siti

Ciao, puoi passare il classpath direttamente da linea di comando

Questo è la linea di comando per compilare

javac -classpath /progetto:/lib /package/*.java

Questa è la line di comando per eseguire

java -classpath /progetto:/lib package.Start

Come puoi notare i percori sono assoluti, i classpath sono settati dinamicamente sia durante la compilazione che l'esecuzione.

analizziamo in dettaglio le righe di lancio!

nella compilazione il comando -classpath viene seguito dei percorsi dei classpath utilizzati per compilare il tuo codice

il primo pezzo (/progetto) è per così dire la home del tuo progetto nella quale hai inserito i package e i sorgenti del progetto vero e proprio

il pezzo (/lib) invece è la radice in in cui sono contenuti per così dire le librerie che utilizzi nei tuoi sorgenti, quindi nel tuo esempio da /lib ci saranno contenuti le cartelle e i file compilati di (poo/geometria)

poi per completare la riga per la compilazione ovviamente devi aggiungere i package e i file java del tuo progetto da compilare come ti ho messo nell'esempio!

intendo package il nome degli eventuali package in cui stai scrivendo il tuo progetto e con *.java compila tutti i file .java all'interno.

La seconda linea di lancio è l'esecuzione, i discorsi sui classpact sono analoghi a quelli menzionati sopra

Ho ipoteticamente ipotizzato che la classe main (il punto di avvio del tuo progetto) si trova all'inteno della classe Start del relatvo package

spero di essere stato il più chiaro possibile cmq casomai possiamo insieme risolvere il problema analizzando il tuo caso.

Le informazioni che mi servono sono:

Il percoso delle librerie

il percoso dei sorgenti del tuo progetto

Il nome della classe main

P.s. Per vitare tutte le volta di scrivere tutto le linee di codice sia per la compilazione che l'esecuzione che come vedi non sono corte potresti creare dei piccoli script che non fanno altro che eseguire gli stessi comandi, rendendoti la vita più semplice

tecnologicamente dipendente

Link al commento
Condividi su altri siti

P.s. Per vitare tutte le volta di scrivere tutto le linee di codice sia per la compilazione che l'esecuzione che come vedi non sono corte potresti creare dei piccoli script che non fanno altro che eseguire gli stessi comandi, rendendoti la vita più semplice

Sono d'accordo e consiglio vivamente di farlo.

Inoltre, su Mac, è possibile eseguire gli Script Shell (quelli di cui parla sadamelik, appunto) anche tramite Apple Script o Automator. In tal modo, con un banale doppio click sull'icona del file Apple Script puoi lanciare compilazione ed esecuzione del codice.

L'unica cosa devi fare attenzione ai percorsi relativi e assoluti. Ma con AppleScript è anche possibile individuare cartelle speciali (come la cartella utente o la scrivania) con semplici comandi e passare tali valori allo Script Shell.

MacPro2,1 - 2 CPU Quad Core 3 GHz, 4 GB RAM, 2 HD 512 GB, Nvidia 8800 GT 512 VRAM, Apple Cinema Display 20'', Mac OS X 10.5.3, Xcode 3.1

MD5 Reader 2Galleria EnderCGSketchbookBlog cinema e FXGalleria (2000-2001)

Link al commento
Condividi su altri siti

spero di essere stato il più chiaro possibile cmq casomai possiamo insieme risolvere il problema analizzando il tuo caso.

Le informazioni che mi servono sono:

Il percoso delle librerie

il percoso dei sorgenti del tuo progetto

Il nome della classe main

Ecco il percorso delle librerie:

/poo (questo è il package)

/poo/geometria

/poo/util

I nomi delle classi che si trovano all'interno di geometria sono:

Cerchio;

Triangolo;

Retta;

Punto;

Rettangolo;

Poligono;

Invece all'interno di util si trova la classe:

Mat;

Ora:

Questo è la linea di comando per compilare

javac -classpath /progetto:/lib /package/*.java

Questa è la line di comando per eseguire

java -classpath /progetto:/lib package.Start

Se ho ben capito ogni volta che voglio importare un package in una mia classe dovrei usare questi comandi, io invece vorrei impostare in modo definitivo il classpath, in modo che ogni volta che vado a compilare non abbia bisogno di specificarlo. Vorrei soltanto dover scrivere: import poo.geometria.*; come quando importo i package già installati da Java.

C'è un modo definitivo per impostare il classpath di poo? Se sì (sono già certo che esista) potete spiegarmi come si fà?

Ho girato un pò su internet e ho visto che alcuni usano da terminale il comando "export", ma non sono riuscito a capire quello che dovevo fare.

Un Tetris in vecchio stile, dedicato alla versione per Mac degli anni 80.

Link al commento
Condividi su altri siti

Vorrei soltanto dover scrivere: import poo.geometria.*;

Si! C'è un modo "definitivo" per impostare il CLASSPATH, ma tu proprio non hai capito la questione.

CLASSPATH è una variabile d'ambiente. Per ambiente si intende un insieme di impostazioni che contraddistiguono le proprietà del "luogo" in cui girano le applicazioni. Ogni sistema operativo ha un suo ambiente con proprietà spesso diverse (Mac OS X e Linux sono abbastanza simili ma Windows, ad esempio, è parecchio diverso). In tutti, comunque, è possibile impostare la variabile d'ambiente CLASSPATH.

Quando Java deve eseguire un applicazione cerca nel CLASSPATH (che in pratica è una lista di percorsi di directory) le eventuali dipendenze di questa applicazione. Se non trova le dipendenze richieste, in nessuno dei percorsi indicati allora chiuderà l'applicazione con un errore.

Con l'applicazione `java' (da Terminale... virgolette escluse) è possibile passare un CLASSPATH temporaneo tramite l'opzione `-classpath' (virgolette escluse). Che è appunto quello che fa il comando:

java -classpath /progetto:/lib package.Start

Questo comando è una cosa totalmente distinta dall'importazione delle librerie all'interno del codice sorgente Java. Come, appunto:

import poo.geometria.*;

Impostare il CLASSPATH in modo definitivo è sconsigliato, nel tuo caso. Di solito lo si fa solo con librerie che devono essere a disposizione di più applicazioni. Comunque, si può fare usando il comando `export' (virgolette escluse) nel modo corretto.

Per farlo devi creare un documento di testo dentro alla tua cartella utente (la Home, usualmente collocata in /Users/nomeutente). Puoi crearlo con TextEdit e dovrai nominarlo .profile oppure .bash_profile (punto incluso). Il primo vale per qualsiasi Shell; il secondo funziona solo con Bash.

All'interno di questo documento dovrai scrivere una sola riga di codice.

export CLASSPATH=/percorso/di/poo

Una volta chiuso e salvato, il documento non sarà visibile dal Finder. Per verificare se esiste devi aprire il Termilale e all'interno della tua cartella utente (Home) devi lanciare il comando:

ls -a

Dovresti essere in grado di vedere il nome .profile o .bash_profile nell'elenco restituito dal Terminale. Quindi puoi verificare il contenuto con:

cat .profile

oppure

cat .bash_profile

a seconda del nome del file che hai creato.

Ora, prima di verificare il risultato, se Terminale era già aperto, quando hai creato il documento con TextEdit, ora devi chiuderlo e riavviarlo, altrimenti non serve.

Per verificare se la variabile CLASSPATH è stata creata correttamente è sufficiente invocare il comando:

echo $CLASSPATH

che restituirà il percorso che avevi impostato.

Fatto questo puoi compilare ed eseguire la tua applicazione senza più preoccuparti di impostare ogni volta l'opzione `-classpath'.

Un ultima cosa. È importante sapere che `export' funziona solo per le variabili d'ambiente del Terminale e, più precisamente, per le variabili d'ambiente della Shell (Bash, Sh, Csh, ...). Le applicazioni avviate dal Finder non riconoscono le variabili impostate con `export'.

Per far si che la variabile d'ambiente sia visibile a tutte le applicazioni, anche quelle lanciate dal Finder, è necessario creare un'altro documento, totalmente diverso. Sta volta si tratta di una Property List. Un documento con estensione .plist.

Per prima cosa è necessario creare una cartella col nome .MacOSX all'interno della tua cartella utente (Home). Anch'essa scomparirà non appena creata.

Non appena creata, apri il Property List Editor (installato con i Developer Tools). Con questo programma devi creare un nuovo documento Property List, selezioni l'elemento Root e fai click sul bottone Add Child. Al nuovo elemento darai il nome CLASSPATH e lascerai il tipo String. Quindi nel terzo campo, immediatamente dopo a String, inserirai il percorso.

Se non hai installato i Developers Tools puoi usare TextEdit per creare la Property List; ricordandoti, per prima cosa, di andare sul menù Formato e selezionare Converti in formato Solo Testo.

Quindi potrai inserire questo testo:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CLASSPATH</key>
<string>/percorso/di/poo</string>
</dict>
</plist>

Infine, salva il documento, all'interno della cartella .MacOSX, col nome environment.plist.

L'ultimo problema da risolvere è riuscire ad accedere alla cartella .MacOSX dalla finestra di salvataggio di TextEdit o Property List Editor. .MacOSX, infatti, è invisibile, come è accaduto prima per .profile.

Andiamo con ordine. Quando fai Registra col nome... o Salva col nome... (COMMAND-SHIFT-S), compare la finestra di salvataggio. Usando la GUI della finestra di salvataggio, vai nella la tua cartella utente. Quindi, premi la scorciatoia da tastiera COMMAND-SHIFT-G. Apparirà una sheet window con un campo di testo. Inserisci al suo interno solo .MacOSX e premi invio. A questo punto, ti troverai all'interno della cartella invisibile .MacOSX, che hai creato nella tua Home.

Quindi, dai il nome corretto al documento e conferma col bottone Registra o Salva.

Per poter vedere gli effetti dell'approccio basato sulla Property List, devi fare il logout e quindi rientrare col tuo utente.

MacPro2,1 - 2 CPU Quad Core 3 GHz, 4 GB RAM, 2 HD 512 GB, Nvidia 8800 GT 512 VRAM, Apple Cinema Display 20'', Mac OS X 10.5.3, Xcode 3.1

MD5 Reader 2Galleria EnderCGSketchbookBlog cinema e FXGalleria (2000-2001)

Link al commento
Condividi su altri siti

Ho provato a creare il documento .profile però ecco cosa mi è successo:

host187-14-dynamic:~ antonioruffolo$ cd /Users/antonioruffolo
host187-14-dynamic:~ antonioruffolo$ ls -a
.			.mplayer		Invia registrazione
..			.netbeans		Library
.CFUserTextEncoding	.netbeans-registration	Movies
.DS_Store		.profile		Music
.Trash			.viminfo		NetBeansProjects
.Xcode			Demo			Pando Packages
.bash_history		Desktop			Pictures
.cups			Documents		Public
.gdb_history		Downloads		Sites
host187-14-dynamic:~ antonioruffolo$ cat .profile
export CLASSPATH=/poohost187-14-dynamic:~ antonioruffolo$ echo $CLASSPATH
/poo
host187-14-dynamic:~ antonioruffolo$ cd /
host187-14-dynamic:/ antonioruffolo$ javac Users/antonioruffolo/Desktop/Prova.java
Users/antonioruffolo/Desktop/Prova.java:2: package poo.geometria does not exist
import poo.geometria.*;
^
Users/antonioruffolo/Desktop/Prova.java:7: cannot find symbol
symbol  : class Punto
location: class Prova
Punto p= new Punto();
^
Users/antonioruffolo/Desktop/Prova.java:7: cannot find symbol
symbol  : class Punto
location: class Prova
Punto p= new Punto();
            ^
Users/antonioruffolo/Desktop/Prova.java:8: cannot find symbol
symbol  : class Punto
location: class Prova
Punto p1= new Punto(1,2);
^
Users/antonioruffolo/Desktop/Prova.java:8: cannot find symbol
symbol  : class Punto
location: class Prova
Punto p1= new Punto(1,2);
             ^
5 errors

Nel documento ho scritto questo:

export CLASSPATH=/poo

Il packge poo l'ho creato su /, quindi il percorso che ho inserito dovrebbe essere giusto.

Considerando quello che ho scritto anche nell'altra pagina, potresti farmi vedere un esempio di come posa utilizzare il comando -classpath? Vorrei importare il contenuto della cartella /poo/geometria nel documento Prova.java

Credo di averti fornito le informazioni che ti servono.

Purtroppo devo impostare il packge in modo definitivo perché è il mio prof a volerlo, a fine corso dovrei essere in grado di creare un programma completo di GUI.

Un Tetris in vecchio stile, dedicato alla versione per Mac degli anni 80.

Link al commento
Condividi su altri siti

...

CLASSPATH è una variabile d'ambiente. Per ambiente si intende un insieme di impostazioni che contraddistiguono le proprietà del "luogo" in cui girano le applicazioni. Ogni sistema operativo ha un suo ambiente con proprietà spesso diverse (Mac OS X e Linux sono abbastanza simili ma Windows, ad esempio, è parecchio diverso). In tutti, comunque, è possibile impostare la variabile d'ambiente CLASSPATH ...

hai commesso un piccolo errorino nella definizione della variabile CLASSPATH

avresti dovuto scrivere

export CLASSPATH=./:/

ora capiamo il perchè!!!

le librerie per sono contenute nella cartella /poo/geometria e /poo/util che sono contenute nella radice del filesystem, quindi per includerle correttamente devi settare il classpath dal livello in cui la cartella poo è contenuta e quindi nel tuo caso si trova in "/" (senza virgolette) che è la radice del filesystem

Mettiamo invece il caso che la cartella poo e tutte le sue sottodirectory fossero in "/user/java/library/poo" (senza virgolette) nel classpath avresti dovuto mettere "/user/java/library" (senza virgolette)

per completezza e correttezza oltre alla cartella "/" (senza virgolette) si aggiunge anche la cartella corrente in cui si esegui il progetto quindi "./" (senza virgolette) ovviamente devi compilare ed eseguire dalla radice del tuo progetto che nel tuo caso sarebbe "/Users/antonioruffolo/Desktop" (senza virgolette).

Per pulizia ti condiglierei di fare:

cd /Users/antonioruffolo/Desktop
javac Prova.java
java Prova

tecnologicamente dipendente

Link al commento
Condividi su altri siti

Il punto della questione è la relazione fra il codice

import poo.geometria.*;

e il percorso di /poo/geometria.

Nella maggioranza dei casi, infatti, le cartelle dei sorgenti di una libreria o un applicazione organizzata come la tua sarebbero configurate in questo modo.

CartellaDelProgetto
|
+-- src
    |
    +-- poo
         |
         +-- geometria

Analogamente, quando compili, le classi compilate verrebbero collocate allo stesso modo, solo in una gerarchia diversa, che al posto di src avrebbe una cartella nominata bin o build.

Usualmente bin viene anche usata come radice per pacchettizzare i JAR (che non sono altro che archivi, compressi o no, con dentro la medesima gerarchia di cartelle e documenti bytecode class).

Quindi bin rappresenta il punto di partenza (radice) per la ricerca.

Essendo che tu non hai bin la cartella radice della tua applicazione Java corrisponde alla radice del disco, ovvero la cartella che contiene poo.

MacPro2,1 - 2 CPU Quad Core 3 GHz, 4 GB RAM, 2 HD 512 GB, Nvidia 8800 GT 512 VRAM, Apple Cinema Display 20'', Mac OS X 10.5.3, Xcode 3.1

MD5 Reader 2Galleria EnderCGSketchbookBlog cinema e FXGalleria (2000-2001)

Link al commento
Condividi su altri siti

Per pulizia ti condiglierei di fare:

cd /Users/antonioruffolo/Desktop
javac Prova.java
java Prova

Infatti è così che faccio, però ancora non ho capito come impostare il classpath del package poo in modo definitivo, ora che ti ho dato tutti i percorsi potresti scrivermi direttamente quello che devo scrivere? Sia per impostare il classpath in modo definitivo che per richiamarlo ogni volta (l'esempio che mi hai fatto nella pagina precedente non sono riuscito ad applicarlo)

Edit: il sito del mio professore spiega come settare il packahge su sistemi UNIX/linux:

Su UNIX/Linux

Si edita la shell utilizzata allo startup, es. la C shell .cshrc esistente nella propria directory home

Si aggiunge una linea del tipo (prestare attenzione agli spazi e ai : e non :sediata::

setenv CLASSPATH /home/user/classdir:.

Se si utilizza la shell Bourne Again o bash, aggiungere la seguente linea al file .bashrc o .bash_profile

della propria directory di lavoro:

export CLASSPATH=/home/user/classdir:.

Questa procedura è applicabile anche su mac? Se sì, cosa dovrei scrivere di preciso (ricordatevi che vi ho dato tutto quello di cui avete bisogno)?

Un Tetris in vecchio stile, dedicato alla versione per Mac degli anni 80.

Link al commento
Condividi su altri siti

Su UNIX/Linux

Si edita la shell utilizzata allo startup, es. la C shell .cshrc esistente nella propria directory home

Si aggiunge una linea del tipo (prestare attenzione agli spazi e ai : e non :

setenv CLASSPATH /home/user/classdir:.

Se si utilizza la shell Bourne Again o bash, aggiungere la seguente linea al file .bashrc o .bash_profile

della propria directory di lavoro:

export CLASSPATH=/home/user/classdir:.

Questa procedura è applicabile anche su mac? Se sì, cosa dovrei scrivere di preciso (ricordatevi che vi ho dato tutto quello di cui avete bisogno)?

È la stessa medesima cosa che ti ho scritto io. Ho praticamente ti ho scritto un tutorial (me ne rendo conto solo adesso) con 2 possibili soluzioni, fra cui quella proposta dal tuo docente. Quindi ora mi domando, l'hai letto? Ma, soprattutto, l'hai capito?

Comunque il problema non sta nella procedura, ma solo nel percorso che hai impostato come valore del CLASSPATH. Però quel che mi domando io è: conosci bene i concetti che stanno alla base dei percorsi in informatica?

Proseguo nelle spiegazioni...

Tu scrivi nella tua classe Prova (implementata nel documento Prova.java):

import poo.geometria.*;

poo.geometria.* è, in pratica un percorso (relativo, per altro) in cui le applicazioni javac (il compilatore) o java (l'interprete) vanno a cercare le dipendenze della tua classe Prova. Per capire meglio cosa sto dicendo potresti sostituire tutti i "." di quell'istruzione con "/" e ottenere poo/geometria/* (ti è più chiaro ora?).

Il CLASSPATH è una lista di percorsi (assoluti o relativi) che Java usa come punto di partenza per cercare ciò che hai specificato nell'istruzione import.

Quindi, ad esempio, se il tuo CLASSPATH fosse uguale a /Users, Java cercherebbe le classi in /Users/poo/geometria/*.

Se CLASSPATH fosse uguale a ../, Java cercherebbe le classi in ../poo/geometria/*.

Il CLASSPATH potrebbe contenere anche più percorsi, separati dal carattere ":" (in ambiente Unix/Mac/Linux, e ";" in ambiente Windows). Un CLASSPATH, di esempio, con più percorsi potrebbe essere /Users:../ (o solo preso i due esempio precedenti e li ho messi assieme). In questo caso Java cercerebbe prima in /Users/poo/geometria/* e, subito dopo, se non avesse trovato le classi ricercate nel percorso precedente, cercrebbe in ../poo/geometria/*.

Capito? In pratica Java non fa altro che unire i percorsi contenuti nel CLASSPATH col percorso specificato nell'istruzione import.

Quindi, siccome la tua cartella poo si trova in /, il CLASSPATH deve essere uguale a / e non /poo o altre cose.

Inoltre sadamelik ti ha suggerito di impostare il CLASSPATH con due percorsi / e ./. Quest'ultimo punta alla cartella corrente (quella in cui ti trovi mentre stai eseguendo javac Prova.java e java Prova). Questo per assicurarsi che Java trovi anche eventuali classi collocate nella cartella dove si trova Prova.

Il risultato, quindi, è che devi impostare il CLASSPATH come /:./. Come ti ha appunto detto sadamelik.

MacPro2,1 - 2 CPU Quad Core 3 GHz, 4 GB RAM, 2 HD 512 GB, Nvidia 8800 GT 512 VRAM, Apple Cinema Display 20'', Mac OS X 10.5.3, Xcode 3.1

MD5 Reader 2Galleria EnderCGSketchbookBlog cinema e FXGalleria (2000-2001)

Link al commento
Condividi su altri siti

Ecco cos'ho fatto: ho creato il documento di solo testo .profile nella mia home e ci ho scritto

export CLASSPATH=/:./

il percorso che ho scritto da quello che ho capito è giusto. Poi ho creato il documento Prova.java sul Desktop

import java.util.*;
import poo.geometria.*;

public class Prova {

public static void main (String args[]) {
Punto p= new Punto();
Punto p1= new Punto(1,2);
double c= p.distanza(p1);
System.out.println("Distanza= "+c);
}
}

Ho verificato da terminale che il documento esiste:

host187-14-dynamic:/ antonioruffolo$ cd /Users/antonioruffolo
host187-14-dynamic:~ antonioruffolo$ ls -a
.			.mplayer		Invia registrazione
..			.netbeans		Library
.CFUserTextEncoding	.netbeans-registration	Movies
.DS_Store		[color="Red"].profile[/color]		Music
.Trash			.viminfo		NetBeansProjects
.Xcode			Demo			Pando Packages
.bash_history		Desktop			Pictures
.cups			Documents		Public
.gdb_history		Downloads		Sites
host187-14-dynamic:~ antonioruffolo$ [color="Red"]echo $CLASSPATH
./:/[/color]

Tuttavia quando provo a eseguire il documento Prova mi dà il seguente errore:

host187-14-dynamic:/ antonioruffolo$ javac Users/antonioruffolo/Desktop/Prova.java
host187-14-dynamic:/ antonioruffolo$ java Users/antonioruffolo/Desktop/Prova
Exception in thread "main" java.lang.NoClassDefFoundError: Users/antonioruffolo/Desktop/Prova (wrong name: Prova)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:675)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:316)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:288)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:374)

L'errore che mi dà ora è sempre legato al classpath? oppure c'è qualcos'altro?

Prima era il compilatore che mi diceva che poo.geometria non esisteva, stavolta invece l'errore compare quando eseguo il programma.

Un Tetris in vecchio stile, dedicato alla versione per Mac degli anni 80.

Link al commento
Condividi su altri siti

..

Poi ho creato il documento Prova.java sul Desktop

import java.util.*;
import poo.geometria.*;

public class Prova {

public static void main (String args[]) {
Punto p= new Punto();
Punto p1= new Punto(1,2);
double c= p.distanza(p1);
System.out.println("Distanza= "+c);
}
}

L'errore che mi dà ora è sempre legato al classpath? oppure c'è qualcos'altro?

Prima era il compilatore che mi diceva che poo.geometria non esisteva, stavolta invece l'errore compare quando eseguo il programma.

Pian piano i problemi li stiamo risolvendo, ma stai commettendo un errore abbastanza grosso concettualmente.

L'errore non è espressamente legato direttamente al classpath, quello che hai scritto tu è perfetto ma è legato al modo in cui compili il progetto e lo esegui.

Ora analizziamo i motivi:

In compilazione va benissimo il comando anche se è sbagliato

$ javac Users/antonioruffolo/Desktop/Prova.java

Perché sbagliato? perchè stai dicendo al compilatore che la classe Prova si trova nel percorso ("Users/antonioruffolo/Desktop/") e quindi contenuto nel package (Users.antonioruffolo.Desktop) ma in compilazione non c'è nessun problema perchè per così dire se ne strasbatte :D (non chiedermi il perché ma non lo so nemmeno io)

invece i esecuzione

$ java Users/antonioruffolo/Desktop/Prova

L'errore è fatale perchè come ho detto prima cerca di eseguire un programma che sta nel package Users.antonioruffolo.Desktop ma invece la classe Prova.java non ha nessuna dichiarazione di package!!!

come ti avevo già spiegato devi andare nella root del tuo progetto che è appunto Users/antonioruffolo/Desktop e da qui compilare ed poi eseguire

quindi ripetiamo insieme :ghghgh:

$ cd Users/antonioruffolo/Desktop
$ javac Prova.java
$ java Prova

e così dovrebbe funzionare

tecnologicamente dipendente

Link al commento
Condividi su altri siti

Funziona perfettamente! Grazie mille per la disponibilità e la pazienza che avete avuto:)

Avevo letto più volte ogni vostro post ma quel dettaglio mi era sfuggito completamente.

Edit: ora ho un altro problema questa volta credo che si tratti di una sciocchezza.

In

/poo/banca

, ho creato un classe chiamata ContoEsteso.

Sto provando ad eseguirla, ecco i passaggi che faccio:

host187-14-dynamic:~ antonioruffolo$ cd /poo/banca
host187-14-dynamic:banca antonioruffolo$ javac ContoEsteso.java
host187-14-dynamic:banca antonioruffolo$ java ContoEsteso
Exception in thread "main" java.lang.NoClassDefFoundError: ContoEsteso (wrong name: poo/banca/ContoEsteso)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:675)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:316)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:288)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:374)

perché mi dà quest'errore? Non mi sembra di aver sbagliato nulla.

Se invece faccio diversamente

host187-14-dynamic:~ antonioruffolo$ cd /
host187-14-dynamic:/ antonioruffolo$ javac poo/banca/ContoEsteso.java
host187-14-dynamic:/ antonioruffolo$ java poo/banca/ContoEsteso
Inserire il numero del conto: 
56687
Inserire l'importo del conto: 
454654
Inserire il fido del conto: 
5000
Il numero di conto è: 56687, il bilancio è di: 454654,00 fido 5000,00
Inserire la somma che si vuole prelevare: 
2000
Il prelievo è avvenuto con successo

Il programma funziona.

Questo è il codice del programma

package poo.banca;
import java.util.*;
public class ContoEsteso extends ContoBancario {
private double fido= 1000;
private double scoperto=0;
public ContoEsteso (String numero) {
 super(numero);
}//costruttore di default
public ContoEsteso (String numero, double bilancio){
super(numero, bilancio);
}//costruttore normale
public ContoEsteso (String numero, double bilancio, double fido){
 super(numero, bilancio);
 this.fido=fido;
}// cstruttore normale con fido
public void deposita (double quanto){
if (quanto<=0) throw new RuntimeException("Numero scorretto");
if (quanto<=scoperto){
scoperto-=quanto; return;
}
double residuo=quanto-scoperto;
scoperto=0;
super.deposita(residuo);
}

public boolean preleva (double quanto){
if (quanto<=0) return false;
if (quanto<=saldo()){
super.preleva(quanto);
return true;
}
 if (quanto<=saldo()+fido-scoperto){
 double residuo=saldo();
 super.preleva(residuo);
 scoperto+=quanto-residuo;
 return true;
 }
return false;
}// preleva

public double fido(){
return fido;
}
public void nuovoFido(double fido){
this.fido=fido;
}
public double scoperto (){
return scoperto;
}

public String toString(){
return super.toString()+" fido "+String.format("%1.2f", fido);
}//toString

public static void main (String args[]){
Scanner s= new Scanner (System.in);
Scanner fido= new Scanner (System.in);
Scanner numero= new Scanner (System.in);
String codice= null;
System.out.println("Inserire il numero del conto: ");
codice= numero.nextLine();
System.out.println("Inserire l'importo del conto: ");
int n= s.nextInt();
System.out.println("Inserire il fido del conto: ");
int f= fido.nextInt();

ContoEsteso a= new ContoEsteso(codice, n, f);
System.out.println (a);
System.out.println("Inserire la somma che si vuole prelevare: ");
n= s.nextInt();
boolean b= a.preleva(n);

if (b==true) {
System.out.println ("Il prelievo è avvenuto con successo");}
else {
System.out.println ("Impossibile prelevare la somma richiesta, non ha abbastanza soldi sul suo conto, le ricordo che il suo fido è di: "+a.fido());}
}//fine main

}// ContoEsteso

Un Tetris in vecchio stile, dedicato alla versione per Mac degli anni 80.

Link al commento
Condividi su altri siti

sempre problema di package!!

package poo.banca;
import java.util.*;
public class ContoEsteso extends ContoBancario {

....
}

come sai hai messo la classe ContoEsteso nel package poo.banca, quindi da come ci siamo sempre detti deve essere eseguita dalla cartella root del progetto e non nella cartella poo/banca

per quello che nel primo caso non funzona e nel secondo invece si perché l'eseguibile java prova a cercare nelle sottocartelle da quella che viene lanciato il file .class ma ovviamente se sei già in poo/banca non trova nessuna cartella (ricordati package = cartelle per rendertela semplice) invece se sei nella root lo trova.

tecnologicamente dipendente

Link al commento
Condividi su altri siti

Scusate se faccio il pignolo, ma a me piace capire a fondo i problemi.

Nel post 22 http://www.italiamac.it/forum/showpost.php?p=3987555&postcount=22 AR89 fa:

host187-14-dynamic:/ antonioruffolo$ java Users/antonioruffolo/Desktop/Prova
Exception in thread "main" java.lang.NoClassDefFoundError: Users/antonioruffolo/Desktop/Prova (wrong name: Prova)

È evidente, guardando la prompt host187-14-dynamic:/ antonioruffolo$, che ha lanciato il comando trovandosi in /Users/antonioruffolo ed è, quindi, altrettanto evidente che, se lancia il comando usando il percorso Users/antonioruffolo/Desktop/Prova, Java non troverà un bel niente perché Users/antonioruffolo/Desktop/Prova è un percorso relativo, percui Bash (neanche Java) espanderebbe il percorso passato come /Users/antonioruffolo/Users/antonioruffolo/Desktop/Prova che, ovviamente, non esiste.

Percorsi corretti potrebbero essere: ../../Users/antonioruffolo/Desktop/Prova (un po' ridondante), che Bash espanderebbe in /Users/antonioruffolo/../../Users/antonioruffolo/Desktop/Prova, oppure /Users/antonioruffolo/Desktop/Prova, che Bash non espanderebbe perché è già un percorso assoluto.

Oppure, ancora, Desktop/Prova, percorso relativo, che Bash espanderebbe in /Users/antonioruffolo/Desktop/Prova.

Ecco perché, secondo me, il discorso dei package non centra niente, in questo caso.

Proprio a tal proposito, non posso dirlo con certezza perché al momento non ricordo benissimo e non ho la documentazione sotto mano, ma, a mio avviso e per la mia esperienza con Java, ritengo che non ci sia alcuna relazione fra i packages e il percorso da cui si compila una classe. I packages sono definiti con la parola chiave package, se quest'ultima non è definita (come appunto succede in Prova.java) javac compila il sorgente come una classe isolata. Se, invece, dentro a Prova.java fosse definita una keyword package e AR89 tentasse di compilare da un percorso diverso, allora si che si otterrebbe un errore. Ma, su questo ci metterei un forse, perché sono propenso a credere che l'errore si manifesti solo in runtime.

Secondo me il tuo problema, AR89, è che non hai ancora capito come funziona il sistema operativo. Questi sono fondamenti (le directory, i percorsi relativi e assoluti, ...) comuni a tutti i sistemi operativi, Mac, Unix, Linux, Windows, DOS, Amiga OS, ... Questi concetti sono comuni a tutti i sistemi e, quindi, a tutti i programmi. Java non è esente. Quindi è importante che capisci e che applichi questi concetti anche alla programmazione e all'avvio dei tool Java, come javac e java.

MacPro2,1 - 2 CPU Quad Core 3 GHz, 4 GB RAM, 2 HD 512 GB, Nvidia 8800 GT 512 VRAM, Apple Cinema Display 20'', Mac OS X 10.5.3, Xcode 3.1

MD5 Reader 2Galleria EnderCGSketchbookBlog cinema e FXGalleria (2000-2001)

Link al commento
Condividi su altri siti

Un percorso assoluto parte sempre dalla radice del disco (nei sistemi Unix like è rappresentata dal simbolo "/" senza virgolette), chiaramente devi sapere anche cos'è la radice del disco.

Tutti i percorsi che iniziano, invece, con ../, ./, ~/ oppure il nome di una cartella, sono relativi. Essi vengono trasformati in un percorso assoluto dall'applicazione (Bash, ad esempio), dal sistema o dalle API (di Java, ad esempio), attaccando all'inizio del percorso relativo, il percorso assoluto della cartella corrente (quella in cui l'applicazione è stata eseguita, ad esempio).

Però, opinione personale, dovresti imparare queste cose prima di programmare Java, altrimenti non serve a niente. Io mi auguro che il vostro docente non abbia dimenticato di istruirvi su questi argomenti, e che la lacuna sia soltanto tua, altrimenti sarebbe preoccupante.

MacPro2,1 - 2 CPU Quad Core 3 GHz, 4 GB RAM, 2 HD 512 GB, Nvidia 8800 GT 512 VRAM, Apple Cinema Display 20'', Mac OS X 10.5.3, Xcode 3.1

MD5 Reader 2Galleria EnderCGSketchbookBlog cinema e FXGalleria (2000-2001)

Link al commento
Condividi su altri siti

Però, opinione personale, dovresti imparare queste cose prima di programmare Java, altrimenti non serve a niente. Io mi auguro che il vostro docente non abbia dimenticato di istruirvi su questi argomenti, e che la lacuna sia soltanto tua, altrimenti sarebbe preoccupante.

Il nostro non ne ha minimamente parlato…:ok:

Tant'è che alcuni miei compagni hanno cominciato a programmare senza saper usare una shell testuale.:oops:

"Errore di configurazione di Windows: mouse e tastiera scollegati. Premere F1 per riavviare."

"Assimilation is futile: Microsoft delenda est!"

6/6/2005: è l'inizio della fine.

Home Page | multiXFinder | OpenArena | SuspendNow!

Link al commento
Condividi su altri siti

Archiviato

Questa discussione è archiviata e chiusa a future risposte.

×
×
  • Crea Nuovo...