• 27.04.2024, 15:32
  • Registrieren
  • Anmelden
  • Sie sind nicht angemeldet.

 

Java Classpath *done*

Sonntag, 17. Mai 2009, 00:08

Hallöchen...

Ich darf mich von Uni-wegen her momentan durch einen Crashkurs "Java für Wiwis und andere Deppen" kämpfen... aber meine Ahnung geht stark gegen 0.
Ich benutze Ubuntu 8.10 (auch keine Ahnung).

Wir haben freundlicherweise ein paar Pakete zur Verfügung, um den Input zu vereinfachen. Laut Anleitung packen wir das in einen Ordner namens "Classes" ins Installationsverzeichniss.
Wenn ich jetzt ein Programm versuche aufzurufen, dass diese Klassen einbindet, bekomme ich einen Fehler. Das Problem liegt im Classpath, wenn ich das richtig sehe.

Quellcode

1
2
3
4
5
Exception in thread "main" java.lang.NoClassDefFoundError: EAjava/Input
	at EATest.main(EATest.java:62)
Caused by: java.lang.ClassNotFoundException: EAjava.Input
	at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
       *schnipp*

Wenn ich "java -cp Pfad/zu/den/Klassen MeinProgramm" aus dem Ordner, in dem das Programm liegt ausführe, gehts.
Wenn ich mein Programm in den Ordner mit den Hilfsteilen packe und von dort mit "java MeinProgramm" ausführe klappts.

Nun habe ich versucht, unter /etc/environment einen Eintrag namens "CLASSPATH" mit dem Ort der Klassen zu machen. Kein Effekt.
Wenn ich in der Konsole mit "export CLASSPATH=$CLASSPATH:Pfad/Zu/den/Klassen" (wenn ich das richtig verstanden habe) etwas auf die Variable $CLASSPATH lege geht es in genau diesem Fenster, und keinem weiteren geöffneten.

Ich bin unglaublich ungeübt in Konsolenspielereien, Ubuntu und Java... das ist eine tolle Kombination! Wer kann mir einen unauffälligen Stubs in die richtige Richtung geben? Wo kann ich etwas passendes lesen? Wie kriege ich die Programme zum laufen, ohne ständig so viel tippen zu müssen - das muss man doch generell einrichten können ("Java, schau dort und dort, ob du Zeugs findest, was du einbinden sollst")

Vielen Dank fürs lesen und evtl Hilfe :)
C!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Les_Conrads« (18. Mai 2009, 23:39)

Zitat von »Lev«

ich frag mich ja wann die autoindustrie anfängt en used-look anzubieten :huh:

Sonntag, 17. Mai 2009, 00:22

Du könntest das zB in die ~/.bashrc packen (solange du die bash nutzt).
Es gäbe zB auch noch /etc/profile oder (wieder für die bash) /etc/bash/bashrc.
In welchen der Dateien das jetzt sauberer ist weiß ich leider nicht.

Sonntag, 17. Mai 2009, 00:32

Ich weiß leider nicht, was du meinst :\... in die Dateien einfügen?

Ganz kurz zu meinen weiteren Experimenten. Wenn ich auf $CLASSPATH den Pfad zu den komischen Klassen lege (export CLASSPATH=$CLASSPATH:pfad), dann funktioniert auch alles. Nur ist die Variable anscheinend in jeder neuen Konsole leer. Ich hab halt nicht wirklich ahnung, was ich da überhaupt mache >< Das ist mehr oder minder alles wildes rumgehacke bis mal etwas halbwegs funktioniert :(


edit4: Nungut - ich habs jetzt glaub ich.
Ich habe in /etc/environment "CLASSPATH" mit dem Pfad zu den komsichen Hilfsklassen belegt, und außerdem mit "."... Wenn ich das recht verstanden habe, sucht er jetzt auch im aktuellen Ordner - genau das, was er auch soll. Bis jetzt hat sich kein weiteres Programm gesträubt :)

edit1: ok - ich bin lernfähig!
Ich hab jetzt in .bashrc nen Eintrag gemacht, der immer $CLASSPATH mit dem entsprechenden Pfad belegt. Das geht jetzt bei jedem Konsolenstart. Mir scheint, die Programme laufen jetzt!

Vielen Dank! Total anders als ich erwartet hätte, dass es funktioniert, aber so ist das halt manchmal :)
edit3: Nee... das waren alles nur zufällig funzende Dinge :(

edit2: Gnarf! Nun funktioniert irgendein stumpfes "HelloWorld" wieder nur, wenn ich java -cp mit Pfad auf eben diese Datei aufrufe...
Das ist doch total dämlich! Wenn ich das richtig verstanden habe, zeigt Classpath Java doch nur, wo es nach einzubindenden Sachen suchn soll. In dem 3-zeiler wird aber nur die eigene Klasse und einmal "main" angesprochen ><...

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »Les_Conrads« (17. Mai 2009, 11:36)

Zitat von »Lev«

ich frag mich ja wann die autoindustrie anfängt en used-look anzubieten :huh:

Sonntag, 17. Mai 2009, 15:55

Könntest du nicht einfach Eclipse als brauchbare IDE einsetzen? Da kann man externe Libs (.jar-Dateien) hinzufügen und dann passt das meist mit dem Classpath von selbst. Auf der Konsole ist das in der Tat manchmal nervig.

Sonntag, 17. Mai 2009, 16:36

Eclipse
installieren, und damit kann man das dann easy einbinden ;)

Sonntag, 17. Mai 2009, 16:59

Theoretisch hab ich eclipse sogar aufm Rechner drauf. Ich habe mich auch schonmal kurz auf meinem 15"er von dem Interface erschlagen lassen.

Aber wir haben in der Uni Pflichtübungen (Präsenzübungen), die in einem quasi gui-freien Unix abgehalten werden. (nebenbei finde ich, ist es ein krasser Tritt in die Eier, wenn man in seinem leben nocht nie programmiert oder außerhalb von Windows gearbeitet hat (wozu ich zum Glück nicht zähle)) Ich möchte bei meinen Vorbereitungen daheim halbwegs so arbeiten, dass ich vor Ort nicht total verzweifel ><... generell währe eine Syntaxkontrolle schon ganz nett, aber mehr als ein java-editor ist nich drinn.

Danke aber für den Tipp.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Les_Conrads« (17. Mai 2009, 17:04)

Zitat von »Lev«

ich frag mich ja wann die autoindustrie anfängt en used-look anzubieten :huh:

Sonntag, 17. Mai 2009, 20:44

Naja, leider ist Java mit seinen Eigenheiten (wie dem Classpath) manchmal auch ein ziemlicher Tritt in die Eier, das würde ich *so* also nicht verallgemeinern ... ;)

Montag, 18. Mai 2009, 21:02

Hi,

leider sind die Infos, die du bisher gepostet hast, etwas zu wenig, um dir detailliert helfen zu können. Aus dem bisherigen Verlauf und dem was du zum HelloWorld schreibst, schließe ich, dass du nicht in dem Verzeichnis startest, wie du offensichtlich annimmst (oder anders gesagt: "." ist nicht das was du erwartest/denkst). Das wird der Grund sein, warum ein .\.. funktioniert.

Versuch einfach mal, die Pfade mit "-cp" absolut und nicht relativ anzugeben. Ansonsten kann ich nur drauf hinweisen, dass die einzelnen Einträge und Linux mit ":" und nicht wie unter Windows mit ";" voneinander getrennt werden.

Gruß, Texx
We'll never stop living this way!

Montag, 18. Mai 2009, 22:51

Äh danke. Ich habs hinbekommen.

Man setzt den Classpath auf den Ordner, in dem die Zusatzklassen liegen ".../Java/classes" und als zweites auf "." . Er vergisst sonst anscheinend plötzlich, dass man bitte auch im Verzeichniss aus dem man ausführt nach ner entsprechenden Datei suchen sollte -_-

Zitat von »Lev«

ich frag mich ja wann die autoindustrie anfängt en used-look anzubieten :huh:

Montag, 18. Mai 2009, 23:15

Ähm, ja.

Das ist richtig und völlig normal. Wenn du einen expliziten CP angibst, dann gilt der exklusiv und allein bestimmend. Alles was da dann nicht drinne ist, das existiert für den Classloader auch nicht.

Gruß, Texx

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Texx« (18. Mai 2009, 23:17)

We'll never stop living this way!

Montag, 18. Mai 2009, 23:35

Aber das war in einer generellen (system-)Variablen -_-... warum sollte ich generell für Java festlegen, dass es EXCLUSIV in einem Ordner nach Programmen sucht? Das ist doch total hirnrissig ><. Wenn ich ein Programm irgendwo aufrufe, sollte man davon ausgehen können, dass ich es AUFRUFEN WILL - und ganz bewusst dieses Programm dort habe, wo es ist.
Darauf muss man zumindest erstmal kommen - mich hat es mehrere Stunden meines Lebens gekostet. Jetzt kann ichs wenigstens den Komilitonen erzählen, die ebenfalls zu Haus ein wenig probieren wollen...

edit: ich kann mir sogar ne Konstellation vorstellen, wo man selbst mit diesem CP nich weiterkommt. Wenn man aus irgendeinem Ordner aus mit "java ~/Pfad/Pfad/Datei " das Programm starten will. Man IST ja nicht in diesem Ordner, also sollte "." dann auch nichts bewirken. Tjaja - aber wieder was gelernt, was ich so schnell nicht vergessen werde ^^

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Les_Conrads« (18. Mai 2009, 23:43)

Zitat von »Lev«

ich frag mich ja wann die autoindustrie anfängt en used-look anzubieten :huh:

Dienstag, 19. Mai 2009, 10:34

Das aktuelle Verzeichnis (`.`) will man etwa vom Classpath ausschließen, wenn da Versionen von Komponenten liegen, die man nicht verwenden will.

Mittwoch, 20. Mai 2009, 23:55

Hi,

der eigentliche Grund, warum man den CP exklusiv setzen will, liegt in der Tatsache, dass man mehre Java-Anwendungen parallel installieren und starten möchte. Dabei kommt es, insbesondere bei grundlegenden Libs/Jars, wie den apache-commons oder meinet halber auch sowas wie Hibernate, zu der Situation, dass unterschiedliche Programme unterschiedliche Versionen ein und der selben Library nutzen. Unter Windows kennt man das equivalente Problem unter dem Namen "DLL Hölle". Wenn der CP nicht exklusiv wäre, könnte man über die Systemvariablen ohne Probleme Libs von sonst wo der VM "untermogeln", was dann mit hoher Wahrscheinlichkeit zu lustigen Fehlern im Programmablauf führt.

Grade um dieses "DLL Hell"-Problem zu unterbinden, bringt jede Java-App ihre eigenen Libs mit (abgesehen von den JRE-Libs) und verweißt auf diese. Wäre der CP nicht exklusiv, würde man in die selben Falle laufen wie unter Windows und unter Unix in bezug auf die Libs.

Sein also froh, dass es exklusiv ist. ;) Für jemanden, der an die "DLL Hell" und den Shell-PATH-Variable-Schwachsinn gewöhnt ist, ist das sicher im ersten Moment ein Ärgernis, aber auf der anderen Seite ist ein Studien-HalloWelt-Drei-Klassen-Fünf-Methoden-Übungsprogramm aber auch nicht die Welt. ;)

Oder um es kurz zu sagen: Nur weil man es (im ersten Moment) nicht kapiert, sind die Anderen nicht gleich doof. 8)

Gruß, Texx
We'll never stop living this way!

Ähnliche Themen