Java Package - HelloWorld

Jahava

Mitglied
Hallo alle zusammen,

ich bräuchte echt mal Hilfe bevor ich durchdrehe. Hab schon alles probiert.

Es geht um eine simple HelloWorld Geschichte aber mit Package.
Benutze Mac OS X 10.7.3 und JEdit.

Alsooo:

1)---------------------- Terminal ---------------------
export CLASSPATH=/Users/username/desktop/
echo $CLASSPATH gibt das dann auch so wieder aus

2)--------------------- JEdit bzw. meine Klasse-------------
package yagmur;
class eins
{
public static void main(String[] args)
{
System.out.println("Hello World");
}
}

3)-------------------- Was ich gemacht habe ---------------
Ich habe auf dem desktop ein Ordner "yagmur" angelegt da mein Package so heisst (???)
Meine eins.java ist da drin. Und habe auch kompiliert, sodass die .class jetzt auch da drin ist.

4)--------------------- FEHLER------------------
Wenn ich nun im selben Ordner im Terminal "java eins" eingebe krieg ich den ...classNotFound......
Exception. Warummm 🙁

5)---------------------Meine Überlegung---------------
Die JVM such ja nach der Klasse im folgenden Ordner:
Das was nm CLASSPATH drin steht + so wie mein Package heißt

Also: /Users/username/desktop/yagmur
Und da ist sie ja auch drin die .class

///////////

Wäre für eure Hilfe echt dankbar, am liebsten mit Hintergrundinformationen.

Dankeeeeee
 
Der packagename muss beim start mit angegeben werden, sowas wie
java yagmur.eins
könnte es tun.

Ansonsten:
2. Java-Tags verwenden
4. StackTrace der Exception posten
 
Damit die Hauptklasse eins auch gefunden wird, sollte diese mit dem Zugriffsmodifizierer (autsch!) public versehen werden. Zu 3): Es ist egal, wo die Klasse abgelegt ist.
 
Zuletzt bearbeitet:
Also hab den zweiten Post auch gelesen und rumprobiert aber:

wenn die class nicht in dem Ordner yagmur drin ist dann geht das nicht.
Sprich sie muss in dem Ordner drin sein der wie das Package benannt ist.

Wenn aber entsprechen dann CLASSPATH gesetzt ist dann kann ich das Programm von überall aus mit
java yagmur.eins
aufrufen.

So Solls auch sein oder ?

Dankeeee schonmal
 
Ganz einfach: der ClassPath zeigt dahin, wo die (kompilierte) class-Datei liegt. Es ist völlig wurscht, wo genau das ist, hauptsache, der ClassPath weiß es. Im Übrigen muss die JAVA-Datei auch nicht da liegen, wo die class-Datei loegt, ich glaube, das wollte mein Vorredner sagen...
 
also, das mit dem .java und .class können auseinanderliegen das war mir auch echo klar.

Aber:

Mein CLASSPATH ist: "/Users/username/Desktop/"
Habe testhalber 2 Ordner auf dem Desktop gemacht. Eine "yagmur" (so heißt auch mein Package, siehe Oben) und eine "guemues"
Wenn die .class in dem Ordner "yagmur" liegt kann ich von überall aus mit "java yagmur.eins" mein Programm starten. Wenn aber meine .class in dem Ordner "guemues" liegt dann kommt wieder die Exception mit .......classNotFound........

Ich denke aber ihr meint das das in beiden Fällen gehen sollte. Dann stellt sich mir die Frage warum geht es nicht oder warum soll es gehen 🙂
 
Ich denke aber ihr meint das das in beiden Fällen gehen sollte. Dann stellt sich mir die Frage warum geht es nicht oder warum soll es gehen 🙂

Java arbeitet mit Wurzelverzeichnissen (Projektverzeichnis). Angenommen dein Wurzelverzeichnis heiss MyJava und darin gibt es ein Verzeichnis yagmur mit der Klasse eins.class. Dann kann diese Klasse mit yagmur.eins vom Wurzelverzeichnis aus gestartet werden. Bei Codieren vom Wurzelverzeichnis aus kann der Namensraum aller Klassen unterhalb dieses Verzeichnisses mit import spezifiziert werden. Alle Klassen ausserhalb dieses Wurzelverzechnisses müssen über CLASSPATH bekanntgegeben werden. Um Deine Frage zu beantworten: Es geht nicht in beiden Fällen.

Wenn man mit jars arbeitet muss man gerade bei der Erzeugung des Jars auf Verzeichnisse und Klassen achten, danach kann das jar überall liegen und aufgerufen werden.
 
Zuletzt bearbeitet:
Wenn dein ClassPath auf "/Users/username/Desktop/" zeigt, dann eben genau auf diesen Ordner. Packete sind ja nichts weiter als stinknormale Ordner, die von JAVA besonders registriert werden. Das heißt, wenn du versuchst, eine Klasse aus dem Ordner yagmur aufzurufen, muss entweder der classPath auch genau in das Packet reinzeigen, oder du musst eben jedes Mal das Packet bei der Ausführung vorn an den Klassennamen anhägen (eben yafmus.eins). Versuchst du das jetzt aber mit guemess, kommt´s zum Fehler, weil guemess kein Packet sondern nur ein stinknormaler Ordnder ist. Aber für JAVA heißt das Packet nicht guemess sondern yagmur, da dies in der ersten Zeile deines Quellcodes so angegeben ist. Stünde da guemess, würde alles funktionieren, solange du die class-Datei nicht wieder in yagmur reinlegst.
Zusammenfassend: der Packet-Ordner muss so heißen, wie dein Packet in der/ den zugehörigen Klassen.
 
OK ich muss das verinnerlichen und dann noch evt. offene Fragen hier stellen, hab aber gleich VWL Vorlesung. Ich meld mich später nochmal.
Aber vielen dank soweit.
 
Super ich glaub soweit hab ich jetzt alles drin.

Der nächste Schritt wäre dann halt das ich zum Beispiel eine zweite Klasse in guemues mache die dann ein anderes Paket ist und sie dann per import Klausel bei der ersten verwende.
Mal gucken in wieweit des dann Klappt 🙂

Dankeee nochmal
 

Zurück
Oben