Mit CLASSPATH kurz vorm Wahnsinn

Hallo, jetzt habe ich mit CLASSPATH die Nase voll und frage Euch einfach mal.

Rahmenbedingungen:

  • JDK 1.3.1; Win98SE; Konsole
  • PATH auf …;C:\Programme\jdk1.3.1_02\bin
  • CLASSPATH auf .;C:\Test\JAV12_BU
  • im Quelltext steht am Anfang:
    package com.herdt.java12.kap02;
  • Konsole:
    C:\Test\JAV12_BU\com\herdt\java12\kap02 >

javac Uebung.java
funktioniert völlig problemlos und erzeugt die *.class-Datei

Problem:
java Uebung
Exception in thread „main“ java.lang.NoClassDefFoundError: Uebung (wrong name: com/herdt/java12/kap02/Uebung)
at …

Ich habe es auch schon mit java -classpath versucht und habe jetzt keinen Ansatzpunkt mehr :frowning:

Wenn ich package raus nehme, dann funktioniert es übrigens völlig problemlos. Aber irgendwo habe ich gelesen, daß man sein Zeug ja in Paketen zusammenfassen soll, wenn’s denn bloß funktionieren würde.

Ich hoffe, daß Ihr mir helfen könnt und ich dieses nervige Problem endlich los werde !!!

Danke, Thomas

Hallo Thomas,
Das Package gehört zur Klasse und muss folgedessen beim Ausführen auch angegeben werden.

C:\Test\JAV12_BU\>java com.herdt.java12.kap02.Uebung

Gruss, Simon

Vielen Dank erst einmal, es funktioniert so auf jeden Fall, aber da habe ich doch gleich noch mal 'ne Frage:

Das Package gehört zur Klasse und muss folgedessen beim
Ausführen auch angegeben werden.

C:\Test\JAV12_BU\>java com.herdt.java12.kap02.Uebung

In mehreren Büchern habe ich schon gelesen, daß ich den Interpreter „java“ von einem beliebigen Verzeichnis aus starten kann. Es soll dann zusammengesetzt werden:
1.) Suche in allen CLASSPATH-Verzeichnissen nach dem Package lt.: package com.herdt.java12.kap02;
–> also: C:\Test\JAV12_BU
2.) Interpretation des Package-Namens, d.h. anhängen an 1.
–> also: C:\Test\JAV12_BU\com\herdt\java12\kap02
3.) Im letzten Schritt wird hier nun nach der Klasse gesucht, d.h. hier also nach Uebung.class

Irgendwie fehlt mir das schlußendliche Verständnis noch dafür! Vielleicht bin ich aber auch nur von der Klarheit von C++ verwöhnt :smile:

Oder kennst Du noch eine andere Möglichkeit, die das oben beschriebene realisiert???

Tschau, Thomas

Also das Package definiert den Namensraum. Deshalb gehört er auch zur Klasse.
Es wäre ja möglich, dass du mehrere Uebung-Klassen hättest. Welche soll dann ausgeführt werden?

die VM (java) kannst Du von überall starten solange die Klasse im definierten Klassenpfad (-classpath) gefunden wird.

Gruss, simon

Vielleicht bin ich aber auch nur von der Klarheit von C++
verwöhnt :smile:

Naja, ein mit C++ geschriebenes Programm findet seine DLLs auch nicht viel anders, halt über den „normalen“ Pfad. :smile:

Grüße, Robert