tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von zerix
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
703
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Steve222 Steve222 ist offline Mitglied Bronze
    Registriert seit
    Mar 2007
    Ort
    Rheinland
    Beiträge
    46
    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
     

  2. #2
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    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
    Steve222 bedankt sich. 
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  3. #3
    Steve222 Steve222 ist offline Mitglied Bronze
    Registriert seit
    Mar 2007
    Ort
    Rheinland
    Beiträge
    46
    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 :
    1
    2
    3
    4
    
    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
     

  4. #4
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    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
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  5. #5
    Steve222 Steve222 ist offline Mitglied Bronze
    Registriert seit
    Mar 2007
    Ort
    Rheinland
    Beiträge
    46
    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
     

  6. #6
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    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 :
    1
    
    Classpath = C:/Test
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    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 :
    1
    
    C:/Test/ein/package/TestKlasse.java

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


    Gruß

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  7. #7
    Steve222 Steve222 ist offline Mitglied Bronze
    Registriert seit
    Mar 2007
    Ort
    Rheinland
    Beiträge
    46
    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
     

  8. #8
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    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 :
    1
    
    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 :
    1
    
    import ein.package.TestKlasse;

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

    Gruß

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  9. #9
    Steve222 Steve222 ist offline Mitglied Bronze
    Registriert seit
    Mar 2007
    Ort
    Rheinland
    Beiträge
    46
    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 :
    1
    2
    3
    4
    
    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
     

Ähnliche Themen

  1. Antworten: 14
    Letzter Beitrag: 14.05.08, 15:52
  2. XAMPP wtf is wrong?
    Von Nohh im Forum Content Management Systeme (CMS)
    Antworten: 3
    Letzter Beitrag: 19.04.08, 14:41
  3. Whats wrong?
    Von Alain im Forum PHP
    Antworten: 8
    Letzter Beitrag: 24.09.04, 16:07
  4. NoClassDefFoundError (wrong name)
    Von SandmannX im Forum Java
    Antworten: 6
    Letzter Beitrag: 16.07.04, 12:14
  5. what's wrong?
    Von braindad im Forum Fun-Forum
    Antworten: 9
    Letzter Beitrag: 02.04.02, 08:52