classpath Problem (Fehler: wrong name)

Steve222

Mitglied
Hallo allerseits,

ein Problem mit der classpath Option ärgert mich:

In den (relativen) Verzeichnissen DDD\DD\D und EEE\EE\E und FFF\FF\F sind jeweils Klassen
die in ObstTest gebraucht werden.

Das Kompilieren mit
"C:\Program Files\Java\jdk1.6.0_05\bin>javac -cp DDD\DD\D;EEE\EE\E;FFF\FF\F; DDD\DD\D\ObstTest.java"
klappt ohne Fehlermeldung und erzeugt entsprechend eine ObstTest.class.

Jedoch, wenn diese mit java ..., also durch

"C:\Program Files\Java\jdk1.6.0_05\bin>java -cp DDD\DD\D;EEE\EE\E;FFF\FF\F; DDD\DD\D\ObstTest"

ausgeführt werden soll erhalte ich


Exception in thread "main" java.lang.NoClassDefFoundError: DDD\DD\D\ObstTest (wrong name: ObstTest)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12
4)
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:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

Was mache ich verkehrt?

Viele Grüße
Steve222
 
Hallo,

du wenn du den Pfad schon beim -cp angibst, darfst du nicht mehr die Klasse über diesen Pfad aufrufen, also ohne DDD/DD/D.

Gruß

Sascha
 
Hallo Sascha
und nochmals Danke.
Das klappte dann damit. :)

Nun etwas anders zum Thema -cp und packages:

In der Literatur heisst es, dass Verzeichnisstruktur und package Namen eng zusammenhängen.
Aber wieso kann ich dann eine Test1.java im (relativen) Verzeichnis DDD\DD\D\
Code:
package D.DD.D;
class Test1{
String ich = "Test1";
}

mit javac DDD\DD\D\Test1.java erfolgreich kompilieren?

-------------------------------
Noch was anderes zum Thema:

Es seien jeweils eine Klasse in diesen drei Source-Files
DDD\DD\D\Test1.java
EEE\EE\E\Test2.java
FFF\FF\F\Test3.java

Wie kann ich die in einem vierten Source-File "HauptTest.java" nutzen, wenn mindestens jedes der drei anderen
in einem anderen package ist?
Oder geht das garnicht?
Müssen alle den gleichen package-Namen haben? Aber das verstösst gegen die Forderung :
Verzeichnisstruktur und package Namen hängen eng zusammen.

Vielen Dank, für die Hilfe.

Gruß, vom sonnigen Rhein,
Steve222
 
Ich weiß jetzt nicht ob ich dich richtig verstanden habe.
Wenn du ein Package angibst, brauchst du dieses nicht als als classpath-Parameter anzugeben.

Für einen solchen Fall gibt es ja die import-Anweisung in den einzelnen Klassen.
Beim cp gibt man nur den Pfad bis zu dem Ordner an, in dem die Packages liegen.

Gruß

Sascha
 
Hallo Sascha,

dass ich mit den Großbuchstaben in den package-Namen gegen
die Konvention verstoßen habe, weiß ich und gelobe Besserung. ;-)

Wenn ein Souce-File Test.java in einer (relativen) Verzeichnisstruktur a\b\c\ sich befindet
und in der ersten Zeile oben package d.r.k; stehen hat, dann
scheint das erstmal kein Problem zu sein, denn Test.java
kann kompiliert werden mit javac a\b\c\Test.java

Damit habe ich offenkundig gezeigt, dass die in der Java-Literatur
getätigte Aussage bzw. Forderung, nämlich dass package-Namen einer class C1 und
Verzeichnisstruktur (Speicherort) dieser class C1 fest zusammenhängen
müssen, eben NICHT gilt oder zumindest nur ein Wunsch ist.
Was soll ich davon nun halten? Muss ich jetzt misstrauischer gegenüber der Java-Literatur sein?

---------------
Was anderes:

Wenn import Anweisungen genutzt werden und gar keine classpath Option beim Kompilieren
läuft alles glatt.

Wenn man dahingegen "java -cp ..." nutzt und gleichzeitig packages kann es grundsätzlich problematisch werden.
Frage:
Kann ich verschiedene Klassen, sagen wir Apfel in Apfel.java Birne in Birne.java und Citrone in Citrone.java
die jeweils in einer verschiedenen Verzeichnisstruktur und auch jeweils in einem verschiedenen package
sind in einer class Obst (in Obst.java) nutzen, indem ich beim Kompilieren von Obst.java über -classpath
diese Verzeichnisstrukturen von Apfel.java, Birne.java und Citrone.java angebe?
Nach meiner Erfahrung geht das nicht, obwohl es heisst, dass man per -classpath benötigte Klassen
für den Kompiliervorgang dazuladen kann.
Was muss ich beachten, wenn packages im Spiel sind und gleichzeitig per -classpath benötigte
Klassen geladen werden sollen?

Viele Grüße

Steve222
 
Es liegt wohl an der Uhrzeit und dass ich gerade aus dem Training komme, aber ich hab deinen Text jetzt nicht richtig verstanden. Ich hab auch ehrlich gesagt, gar nicht verstanden, was du da jetzt getestet hast.

Bei der package-Anweisung muss der Pfad relativ zum classpath stehen.
Bsp:
Code:
Classpath = C:/Test
Java:
package ein.package;

public class TestKlasse{

    public static void main(String args[]){
         System.out.println("TestKlasse");
   }

}

Das heißt dass die Klasse jetzt in
Code:
C:/Test/ein/package/TestKlasse.java

Wenn du dich jetzt in C:/Test befindest, musst du keinen Classpath angeben.
Code:
javac ein/package/Test.java
Ausführen
Code:
java ein.package.TestKlasse
Befindest du dich in irgendeinem anderen Pfad musst du den Classpath angeben.
Code:
javac -cp C:/Test ein/package/Test.java
Ausführen
Code:
java -cp C:/Test ein.package.TestKlasse


Gruß

Sascha
 
Hallo Sascha,

und Danke für das kleine Beispiel, obwohl es nicht meine eigentliche Frage beantwortet.
Ich habe schon mal erfolgreich testweise mit verschiedenen package und imports gearbeitet und kenne eigentlich die
Grundlagen.
Was mich nun nteressiert ist, was geht und was nicht geht, wenn man die classpath Option verwendet und
aber auch packages im Spiel hat..

Mit dem
Befindest du dich ...
meinst Du wohl das (aktuelle) Verzeichnis in dem javac.exe und java.exe drin ist, nur da kann ja
kompiliert und ausgeführt werden.

Dir sind wohl Fehlerunterlaufen, z.B.

Befindest du dich in irgendeinem anderen Pfad musst du den Classpath angeben.
Code:
javac -cp C:/Test ein/package/Test.java

Hier hattest Du wohl "javac -cp C:/Test ein/package/TestKlasse.java" gemeint und weiter oben wohl auch
TestKlasse.java" statt Test.java"

Aber dennoch freundlich von Dir, trotz Ermüdungserscheinungen noch zu antworten. :)

Gruß
Steve222
 
Wenn du deine Umgebungsvariablen richtig gesetzt hast, kannst du dich überall auf der Festplatte befinden, da du von überall javac bzw java aufrufen kannst.

Hier hattest Du wohl "javac -cp C:/Test ein/package/TestKlasse.java" gemeint und weiter oben wohl auch
TestKlasse.java" statt Test.java"

Genau, ich meinte TestKlasse.java.

Ich muss zugeben, ich verstehe dein Problem immer noch nicht.

Um bei meinem Beispiel zu bleiben, wenn eine Klasse in ein/Package liegt, muss in der Klasse folgende Deklaration stehen
Code:
package ein.package;


Wenn du diese Klasse in einer anderen Klasse die nicht im gleichen Package liegt nutzen möchtest, musst du folgende Import-Anweisung nutzen
Code:
import ein.package.TestKlasse;

Falls ich dein Problem immer noch nicht getroffen habe, erläutere es bitte nochmal.

Gruß

Sascha
 
Hallo Sascha,
wie erwähnt kenne ich die Grundlagen, dennoch macht mich z.B. folgends stutzig:

In der Literatur heisst es, dass Verzeichnisstruktur und package Namen eng zusammenhängen.

Ich fragte mich zunächst, ob das eine feste Regel ist oder eine Empfehlung.
Es scheint eine Empfehlung zu sein, denn wie bereits erwähnt kann ich
eine Test1.java im (relativen) Verzeichnis g\gg\g\ erfolgreich kompilieren, auch wenn
class Test1 einem package a.b.c ; zugeordnet ist.

Code:
package a.b.c ;
public class Test1{
String ich = "Test1";
}



------------------
noch etwas:
In der Literatur heisst es:

"Wenn man Klassen in packages tut und dann anfängt classpaths zu nutzen um genau
diese Klassen zu finden, dann kann es schwierig bzw. knifflig werden."

Deshalb habe ich mit classpath und packages gleichzeitig (bzw. in der selben Kompilierung)
experimentiert und bin zu oben stehenden Frage gekommen.

Frage (als exakte Wiederholung):
Kann ich verschiedene Klassen, sagen wir Apfel in Apfel.java Birne in Birne.java und Citrone in Citrone.java
die jeweils in einer verschiedenen Verzeichnisstruktur und auch jeweils in einem verschiedenen package
sind in einer class Obst (in Obst.java) nutzen, indem ich beim Kompilieren von Obst.java über -classpath
diese Verzeichnisstrukturen von Apfel.java, Birne.java und Citrone.java angebe?
Nach meiner Erfahrung geht das nicht, obwohl es heisst, dass man per -classpath benötigte Klassen
für den Kompiliervorgang dazuladen kann.
Was muss ich beachten, wenn packages im Spiel sind und gleichzeitig per -classpath benötigte
Klassen geladen werden sollen?

Viele Grüße
Steve222
 

Neue Beiträge

Zurück