Gleiches Verzeichnis für class und java unter Windows Muss?

zimtstern

Mitglied
Hallo zusammen, 🙂

ich arbeite schon seit 4 Jahren im Unterricht mit Java, allerdings über Linux.
Nun wollte ich auch unter Windows Java programmieren und habe mir auch schon die jdk und jre heruntergeladen und die path-Umgebungsvariable angepasst.
Wie im Unterricht beigebracht bekommen, wollte ich es auch unter Windows beibehalten, die java-Dateien und die class-Dateien in unterschiedlichen Verzeichnissen unterzubringen, z.B.:
\java\sources\halloWelt\HalloWelt.java
\java\classes\halloWelt\HalloWelt.class
Das mit dem Kompilieren klappt auch soweit, aber beim Ausführen scheitert's (siehe Bild).
HauptklasseNotFound.PNG

Auf Verdacht habe ich die class-Datei ins Verzeichnis der java-Datei kompliliert und siehe da, es klappt!
Ich bin auch schon direkt ins Verzeichnis der class rein und wollte da ausführen, lieferte denselben Fehler.
Also muss unter Windows class und java am selben Ort gespeichert sein?

Liebe Grüße,
zimtstern
 
Zuletzt bearbeitet:
Du brauchst beim Ausführen einen '.' zwischen "Verzeichnisname" und Klassenname anstatt einem '\'.
Dann sollte es eigentlich funktionieren.
Muss aber eigentlich unter Linux auch so gewesen sein?

Auf jeden Fall bildet Java packages auf Verzeichnisse ab, was man ggf. berücksichtigen muss.
 
Zuletzt bearbeitet:
Bedenke, dass unter Windows Pfade mit \ verbunden werden, während sie unter Linux mit / verbunden werden. Eventuell hast Du da ein Problem bei Deine Konfiguration.

Und deshalb im Code auch immer schön File.seperator benutzen 😉

Gruß

Claus
 
Vielen Dank, arilou und Thallius!
Das mit dem Punkt war's. Unter Linux werden nur slashs benutzt. Dass Windows backslashs braucht wusste ich, aber das mit dem Punkt... 😳
Danke nochmal, damit wär mein Problem dann geklärt.
 
Leider habe ich das Problem wieder. Beim Ausführen einer einfachen HalloWelt hat das mit dem Punkt geklappt, aber bei meinem totalen Dea nicht. Das kann ja theoretisch dann nur am Quellcode liegen, der ist aber richtig bzw. unter Linux funktioniert alles bestens.
Anhang anzeigen 7016

ich nehme mal an, das sollte in einen neuen Thread, aber in welche Forenkategorie?
 
Zuletzt bearbeitet:
Durch das Schlüsselwort package kann eine Klasse (aber auch ein Interface) einem Package zugeordnet werden. Ziel dieser Zuordnung ist es, eine bessere Strukturierung der Klassen zu erhalten. Klassen, die logisch in irgendeiner Art zusammengehören, die einem gemeinsamen Zweck dienen, werden dem gleichen Package zugeordnet.

Das wusste ich bereits. Wo ist das Problem?
Und wie hilft mir das jetzt bitte beim Lösen meines Problems?
 
Java bildet packages als (Unter-)Verzeichnisse im Dateisystem ab.
D.h. .class-Dateien müssen schon mal diesbezüglich korrekt eingeordnet sein.
Zusätzlich (wenn die Klasse mit der .main in einem package steckt) muss man beim Aufruf das package mit angeben:
java package1.subpackage.HauptKlasse
Und hier werden dann Punkte verwendet (anstatt '\' oder gar '/'). Und man muss sich (als "aktuelles Verzeichnis") im "package-root" befinden.

Anders ausgedrückt: Es gibt Gründe, warum Gott und die Welt eine IDE verwendet; und warum "fertige" Java-Programme als .jar verpackt verteilt werden... spart einfach einen großen Haufen Fehlermöglichkeiten.
 
Zuletzt bearbeitet:
Hallo arilou.
Java bildet packages als (Unter-)Verzeichnisse im Dateisystem ab.
D.h. .class-Dateien müssen schon mal diesbezüglich korrekt eingeordnet sein.
Die class-Dateien sind doch korrekt eingeordnet. Mit javac -d sage ich ihm, wo die class gespeichert werden soll, und dort werden dann package und subpackes der .java für die .class übernommen.
"sources\halloWelt\HalloWelt.java" --> "classes\halloWelt\HalloWelt.class"
Das funktioniert unter Linux und unter Windows genauso. Das ist also nicht das Problem.
Zusätzlich (wenn die Klasse mit der .main in einem package steckt) muss man beim Aufruf das package mit angeben:
java package1.subpackage.HauptKlasse
Das ist mir schon klar und das tue ich doch auch: "java -cp java\classes" sagt ihm, wo Klassen im allgemeinem sind und "automaten\totalerDea\dea1\apps.UI_Dea1" gibt package und auszuführende Klasse an. Unter Linux funktioniert das einwandfrei, möglicherweise ja unter Windows nicht. Wenn ich allerdings direkt ins Verzeichnis "apps" gehe und dann "java UI_Dea1" befehle, bekomme ich denselben Fehler! Daran kann es also auch nicht liegen.
(Ansonsten befinde ich mich natürlich immer im package-root)

Anders ausgedrückt: Es gibt Gründe, warum Gott und die Welt eine IDE verwendet; und warum "fertige" Java-Programme als .jar verpackt verteilt werden... spart einfach einen großen Haufen Fehlermöglichkeiten.
Meiner Meinung nach ist das keine besonders gute Argumentation. Ich könnte ja genauso sagen: "Unter Linux funktioniert alles einwandfrei, nur Windows macht Probleme, benutzt nie wieder Windows!" Ich verstehe deine Ansicht, aber das hilft mir nicht weite.
Mir zu einer IDE zu raten, ist ja keine Lösung meines Problems (die ich ja aber möchte), sondern nur eine Alternative. Und danach habe ich nicht gefragt. 🙂


LG, Zimtstern
 
Die class-Dateien sind doch korrekt eingeordnet. Mit javac -d sage ich ihm, wo die class gespeichert werden soll, und dort werden dann package und subpackes der .java für die .class übernommen.
"sources\halloWelt\HalloWelt.java" --> "classes\halloWelt\HalloWelt.class"
Das funktioniert unter Linux und unter Windows genauso. Das ist also nicht das Problem.

[...]

Das ist mir schon klar und das tue ich doch auch: "java -cp java\classes" sagt ihm, wo Klassen im allgemeinem sind und "automaten\totalerDea\dea1\apps.UI_Dea1" gibt package und auszuführende Klasse an. Unter Linux funktioniert das einwandfrei, möglicherweise ja unter Windows nicht. Wenn ich allerdings direkt ins Verzeichnis "apps" gehe und dann "java UI_Dea1" befehle, bekomme ich denselben Fehler! Daran kann es also auch nicht liegen.
(Ansonsten befinde ich mich natürlich immer im package-root)
Da liegt nunmal der Hund begraben; du hast einen Denkfehler in deinen Aufrufen.
Ein Teil der Pfadangabe ist Pfad_zur_PackageRoot, der nachfolgende Teil ist dann aber Package_Einordnung. Und genau an dieser Trennstelle muss der java-Aufruf trennen mittels
-cp Pfad_zur_PackageRoot
und
Package_Einordnung.Hauptklasse
. Es ist eben nicht zulässig, einfach eine Verzeichnisebene "tiefer" das Javaprogramm starten lassen zu wollen (also sich eigentlich schon in einem Package zu befinden) oder den hinteren Teil des Classpath nachträglich "zu einem Package zu erklären".
Unter Windows werden Verzeichnisse (-cp) mittels '\' untergliedert; java untergliedert packages aber mit '.' .
Möglich, dass JVMs unter Linux da etwas "flexibler" sind, da bin ich nicht so vertraut damit.
 
Zuletzt bearbeitet:
Hallo arilou!

Ein Teil der Pfadangabe ist Pfad_zur_PackageRoot, der nachfolgende Teil ist dann aber Package_Einordnung. Und genau an dieser Trennstelle muss der java-Aufruf trennen mittels
-cp Pfad_zur_PackageRoot
und
Package_Einordnung.Hauptklasse
Möglich, dass ich dich da falsch verstanden hab und du meinst, dass man das genau SO nicht macht, aber meiner Meinung nach trennt mein Befehl zwischen Pfad_zur_PackageRoot und Package_Einordnung.Hauptklasse
Code:
-cp java\classes
und
Code:
automaten\totalerDea\dea1.Dea1
oder irre ich mich da? zumindest beginnt das package mit "automaten" wie ja auch in meinem Befehl.
Es ist eben nicht zulässig, einfach eine Verzeichnisebene "tiefer" das Javaprogramm starten lassen zu wollen (also sich eigentlich schon in einem Package zu befinden) oder den hinteren Teil des Classpath nachträglich "zu einem Package zu erklären".
Richtig, ist ja auch logisch. Das hätte ich auch selber merken können, keine Ahnung wie ich darauf kam, pure Verzweilung nehme ich an :bloed:
Unter Windows werden Verzeichnisse (-cp) mittels '\' untergliedert; java untergliedert packages aber mit '.' .
Die Aussage verstehe ich ehrlich gesagt nicht. :bahnhof:
"-cp" bzw. "-classpath" ist doch javac/java spezifisch. Unterteilt java packages also vollständig mit "." beim Ausführen? --> "automaten.totalerDea.dea1.Dea1"
so ist ein packages ja im Quellcode angegeben.
Möglich, dass JVMs unter Linux da etwas "flexibler" sind, da bin ich nicht so vertraut damit.
Also eigentlich dürfte sich eine JVM unter Linux ja nicht von der unter Windows unterscheiden, nur ist die Syntax vom Terminal und cmd unterschiedlich (darüber stolpere ich ja schon von Anfang an)

Es ist echt so deprimierend im Urschleim rumzuwühlen 🙁
Also mittlerweile ist ja nun klar geworden, dass ich einfach nicht weiß, wie ich`s richtig machen soll. Wie würdest du denn den Befehl schreiben?

Liebe Grüße,
zimtstern
 
Unter Windows werden Verzeichnisse (-cp) mittels '\' untergliedert; java untergliedert packages aber mit '.' .
Die Aussage verstehe ich ehrlich gesagt nicht. :bahnhof:
"-cp" bzw. "-classpath" ist doch javac/java spezifisch. Unterteilt java packages also vollständig mit "." beim Ausführen? --> "automaten.totalerDea.dea1.Dea1"
so ist ein packages ja im Quellcode angegeben.
Genau richtig. In der Package_Unterteilung gibt es keine '/' oder '\', nur '.' - auch beim Aufruf von der Kommandozeile.
(Gilt für die Standard-Oracle JVM unter Windows. Nach Deiner Aussage akzeptiert die Linux-JVM auch '/' statt '.' .)

Also eigentlich dürfte sich eine JVM unter Linux ja nicht von der unter Windows unterscheiden, [...]
Denkfehler. Die JVMs dürfen sich nicht unterscheiden bzgl. des Ausführens von Bytecode. Sie dürfen sich aber durchaus unterscheiden darin, wie sie selbst aufgerufen werden. Auch dürfen sie verschiedene Garbage Collectoren haben, oder (intern) verschiedene Implementierungen der Standardklassen.
 

Zurück
Oben