Classpath Compiler lässt sich nur bedingt von Kommandozeile aus starten

CodeCrack

Mitglied
Ich habe zuletzt immer Code mit eclipse compiliert und ausgeführt und jetzt wollte ich mal auf die Kommandozeile von Windows gehen.

Das geht:
javac C:\Andreas\Programmierung\Java\eclipse\project\src\pro\Demo.java

Aber das geht nicht:
javac -cp C:\Andreas\Programmierung\Java\eclipse\project\src pro.Demo.java

Und das geht auch nicht:
javac Andreas\Programmierung\Java\eclipse\project\src pro.Demo.java

Warum nicht?
 
Jup, soll das Packege sein. Ich habe oben einen Fehler. Die 3. Anweisung sollte auch mit "-cp" sein. Somit ist das mit dem Punkt beim Package korrekt.
 
Das vollständige Kommando sollte eigentlich so lauten:
javac -cp Andreas\Programmierung\Java\eclipse\project\src pro.Demo.java

Meines Wissens, wird der Klasse das Package, mit Punkt getrennt, angegeben. Ist das falsch?
 
Das vollständige Kommando sollte eigentlich so lauten:
javac -cp Andreas\Programmierung\Java\eclipse\project\src pro.Demo.java

"Andreas\" ist in dem Fall allerdings ein relativer Pfad und damit je nach aktuellem Arbeitsverzeichnis ein völlig anderer als "C:\Andreas" - was bei dir grad richtig ist, wäre nur raten 😉

Meines Wissens, wird der Klasse das Package, mit Punkt getrennt, angegeben. Ist das falsch?
In dem Fall gibt man (afaik) den Pfad zur Datei und nicht das Package an, von daher nicht mit '.' sondern '/' bzw '\'.
 
Ok, mit den absoluten und den relativen Pfaden, das habe ich verstanden. Ohne -cp klappt auch beides. Jetzt sagt mir nochmal, woraus muss die cp-Angabe bestehen, allgemein und wenn ihr es konkret machen wollte, geht von folgendem absoluten Pfad aus: C:\Andreas\Programmierung\Java\eclipse\project\src\pro\Demo.java
 
Also entweder stimmt deine Angabe nicht, oder mit meinem Setup stimmt etwas nicht. Es funktioniert so jedenfalls nicht. Aber immerhin klappte es - wie oben angegeben - ohne -cp.
 
Das kann auch nicht funktionieren.
javac sucht Dateien entweder vom aktuellen Pfad aus (bei relativer Angabe), oder benötigt einen absoluten Pfad für die zu kompilierende Klasse
-cp beeinflusst NICHT den Ort, an dem der Code gesucht wird.

Sagen wir, du befindest dich in "c:\dist"
Dann sucht dieser Befehl:
javac -cp "C:\Andreas\Programmierung\Java\eclipse\project\src" pro\Demo.java
nach c:\dist\pro\Demo.java

CP ist nur dazu da, um Resourcen zu finden, die du zum Kompilieren der Klasse pro.Demo benötigst (wenn pro.Demo also auf andere Klassen verweist).
Wenn du dich nicht in einem Parent-Verzeichnis deiner Source-Datei befindest, brauchst du immer absolute Pfade.

Geh das Ganze mal so an:
c:\
cd "C:\Andreas\Programmierung\Java\eclipse\project\src"
javac -cp .;c:\hier_liegen_resourcen -d "c:\hier_soll_der_schmuh_hin\dist" pro\Demo.java
 
Zuletzt bearbeitet:
Das geht leider auch nicht. Immer derselbe Fehler, egal, was ich mache: "javac: no source files", es sei denn, ich lasse die "-cp"-Angabe weg, wie oben dargestellt. 🙁 Btw., ist das mit ".;c:" korrekt oder ein Schreibfehler von dir?
 
Tu mir mal einen Gefallen und poste einen Screenshot der Kommandozeile, wenn du das machst.
Das klingt ganz danach, als ob du immer noch im falschen Ordner wärst.
Und poste außerdem (mit entsprechenden Tags) deine Demo-Klasse.

Und nein, das war kein Schreibfehler, der Klassenpfad kann ja mehrere Verzeichnisse enthalten, getrennt durch Semikolon.
In diesem Fall wären das
1. "." (aktuelles Verzeichnis) und
2. "c:\hier_liegen_resourcen" (Das war ein Beispielaufruf, ersetze das durch was immer du willst)
Dass man - falls Leerzeichen vorhanden sind - vorne und hinten mit Anführungszeichen umschließen muss, versteht sich von selbst, selbiges gilt für alle anderen Dateipfadangaben.
 
v5fp64s4.png

Wie ihr seht: Der erste Aufruf (ohne -cp) klappt, die drei anderen Varianten nicht.
 
Wie ihr seht: Der erste Aufruf (ohne -cp) klappt, die drei anderen Varianten nicht.
Du machst auch nicht das, was @Neumi5694 beschrieben hat:

Geh das Ganze mal so an:
c:\
cd "C:\Andreas\Programmierung\Java\eclipse\project\src"
javac -cp .;c:\hier_liegen_resourcen -d "c:\hier_soll_der_schmuh_hin\dist" pro\Demo.java


Was dir fehlt ist das wechseln in den Source-Ordner (cd "C:\Andreas\Programmierung\Java\eclipse\project\src")
 
Variante 2 sollte funktionieren, sobald du dich beim aufruf von javac im src-Ordner befindest (sofern meine Annahme stimmt und die Klasse "Demo" im Package "pro" liegt, Code liegt uns leider noch keiner vor).
Variante 3 wird garantiert nie funktionieren, da es keine Datei namens ".\pro.Demo.java" gibt.

Bei meiner "probier's mal so" Anleitung steht noch ein Fehler drin. Ich habe als erstes "c:\" genannt, hier sollte aber "c:" stehen. Das ist aber unerheblich, da du dich eh schon auf dem richtigen Laufwerk befindest.
 
Ich habe es jetzt noch nicht probiert, vermute aber, ihr habt Recht und eure Variante wird dann funktionieren.

Was soll das denn?! Wozu brauche ich denn dann die "-cp"-Angabe, wenn ich mich eh im src-Verzeichnis befinde?! Das -cp ist für die class-Dateien, schon klar, aber irgendwie ist das trotzdem sinnlos, da der Ordner mit den class-Dateien ja ein, ich nenne es mal Parallel-Ordner des src-Ordners, ist.
 
CP ist das wichtigste überhaupt, wenn du nicht alles selbst programmieren willst 🙂
Als praktisches Beispiel denk mal an einen JDBC-Datenbanktreiber. Damit dein Programm die darin enthaltenen Methoden und Klassen zugreifen kann, bzw. der Compiler sie findet, musst du mit -cp auf die entsprechenden Jar-Dateien oder src-Verzeichnisse verweisen.

Es gibt dann noch den sourcepath, mit dem du auf andere Sourcen verweisen kannst.
Aber auch hier gilt, dass die DATEI, auf die du beim Compiler-Aufruft verweist, direkt verfügbar sein muss.
Letztendlich kannst du beim Build noch das Ziel-Verzeichnis angeben.

Die normale Vorgehensweise ist diese:
1. Beim Kompilieren solltest du dich im Source-Verzeichnis befinden.
2. Auf eingebundene Libraries / Jars verweist du mit -cp
3. Als letztes gib noch ein Zielverzeichnis an, damit deine .class-Dateien nicht im Source-Ordner landen.
4. Erzeuge eine Auflistung aller Java-Dateien im Ordner und dessen Unterordnern und kompilierre sie mit for-each. Der Compiler wird Abhängigkeiten erkennen und doppeltes Kompilieren verhindern.
 

Zurück
Oben