An Profis: NoClassDefFoundError bei 1 von 20 Usern

Status
Nicht offen für weitere Antworten.
F

Florian Scheidler

Gast
Hallo zusammen,

für meine Firma habe ich eine Java-Anwendung programmiert, welche in jeder Niederlassung zentral auf einem Fileserver liegt. Die User greifen also alle auf dieselbe Anwendung zu. Das funktioniert auch bei allen Usern außer bei einem Mitarbeiter in München. Dieser erhält wenn er die Anwendung starten will folgende Fehlermeldung:

Exception in thread "main" java.lang.NoClassDefFoundError: Login

Login.java und Login.class liegen aber am richtigen Ort und wie gesagt: bei allen anderen funktioniert es und die greifen alle aufs selbe Tool zu.
Es kann also nur an den Einstellungen des lokalen PCs liegen. Die installierte Java-Version ist überall dieselbe (j2re1.4.2_07) und auch alle Liberies sind wie bei allen korrekt unter JavaPfad\lib\ext hinterlegt. Nun kann das Ganze ja vielleicht noch mit den Windows-Umgebungsvariablen zusammenhängen.
Auch hier ist es überall dasselbe: Es gibt eine Varible JAVA_HOME, die direkt auf das bin-Verzeichnis des Java-Installationspfades verweist.

Meine Frage nun:
Welche Parameter muss ich in den verschiedenen Umgebungsvariablen vielleicht noch setzen?
Was für Gründe kann es noch geben, weswegen das Tool nicht läuft und der oben genannte Fehler geschmissen wird?
Warum finde ich eigentlich im Bin-Verzeichnis der Java-Installation bei keinem User eine javac.exe, die doch eigentlich zum kompilieren gedacht ist? Oder wo liegt die sonst?

Gruß Florian Scheidler
 

Bleiglanz

Gesperrter Benutzer
Die installierte Java-Version ist überall dieselbe (j2re1.4.2_07) und auch alle Liberies sind wie bei allen korrekt unter JavaPfad\lib\ext hinterlegt.
korrekt ist kaum das richtige Wort

=> in lib\ext hinterlegt man normalerweise GAR NICHTS

Wie startet man denn die App? doppelklick auf eine jar?

die user brauchen kein javac, das ist OK
 
F

Florian Scheidler

Gast
Hallo Bleiglanz,

naja in der Install-Anleitung zur MySql_Connector-Lib wurde gesagt ich solle diese .jar in das Verzeichnis lib\ext hinterlegen und es funktioniert so ja auch überall, außer bei dem Kollegen X in München.
Stimmt, die User haben ja alle nur die Laufzeitumgebung und nicht die Entwicklungsumgebung wie ich ;)
Die haben also logischerweise keine javac.exe.
Die Anwendung wird über eine Batch-Datei gestartet, welche folgendes macht:

cd\
G:
cd OP_Tool
java offeneposten/Login

G: ist die Laufwerksverknüpfung zum Fileserver und auch das ist überall gleich.
"offeneposten" ist dabei das Package, in dem die .java und .class-Dateien kompiliert liegen. Diese Batchdatei rufen alle Benutzer auf und es klappt.
Hab Java bei dem User auch schon mehrfach neu installiert, doch es funktioniert immernoch nicht.

Grüße Florian Scheidler
 

Bleiglanz

Gesperrter Benutzer
java -version

mal prüfen :)

java -cp . offeneposten.Login

damit nach dem cd auch das aktuelle Verzeichnis im classpath ist

ist u.U. die System(!)Variable CLASSPATH bei dem User belegt?

naja in der Install-Anleitung zur MySql_Connector-Lib wurde gesagt ich solle diese .jar in das Verzeichnis lib\ext hinterlegen
zeig her, wo, das will ich sehen

für den Produktivbetrieb ist das absoluter Mist
 
F

Florian Scheidler

Gast
java -version funktioniert bei ihm, das hab ich vorhin auch ausprobiert.

Was genau bewirkt denn java -cp . offeneposten.Login außer dass das Tool aufgerufen wird? Habe es gerade an meinem PC ausprobiert, da der PC des Münchners schon aus ist und die Umgebungs-Variable CLASSPATH ist dannach genausowenig vorhanden wie vorher.


ist u.U. die System(!)Variable CLASSPATH bei dem User belegt?

Bei dem Münchner standen mehrere Pfade in der CLASSPATH-Variable. Darf da nichts drin stehen?

Gruß Florian Scheidler
 
F

Florian Scheidler

Gast
Erstens bin ich grundsätzlich nur fürs reine Programmieren zuständig, fürs einrichten etc... haben wir einen Admin und zweitens sind meine Anwendungen nur für den internen Gebrauch. Du würdest dich wundern, was ich schon für komplexe Anwendungen für meine Firma programmiert habe und dabei sind wir eigentlich ne Speditionsfirma.
Egal, auf jeden Fall wäre es nett, wenn du mir kurz sagst was ich beim CLASSPATH zu beachten habe. Der Classpath ist also eine Systemvariable. Und ist diese Variable nur für Java-Klassenpfade reserviert oder ähnlich dem normalen PATH? Erklär mal bitte, man lernt ja nie aus.

Gruß Florian Scheidler
 
B

bygones

Gast
was classpath ist und wie man ihn korrekt setzt findest du in den FAQ....
 
G

Guest

Gast
Vergiss CLASSPATH und lib/ext

Konfiguriere Deine Anwendung immer so, dass sie nicht auf Einstellungen auf
dem Client-PC angewiesen ist (JRE Version etc. mal ausgenommen)

Du hast mindestens zwei Möglichkeiten:

- Classpath beim Start der Anwendung angeben

java -cp .;mysql-was-auch-immer-bin.jar; package.KlasseMitMain
bzw. unter Linux/Unix/Solaris/Mac
java -cp .:mysql-was-auch-immer-bin.jar: package.KlasseMitMain

(alternativ statt -cp kannst Du -classpath schreiben)

- Classpath in Manifest.mf der Jar-Datei eintragen (die bessere Methode)

Class-Path: ./lib/mysql-was-auch-immer-bin.jar

Es geht noch über Batch-/Scriptdateien, ist aber nicht so sexy.
 

Bleiglanz

Gesperrter Benutzer
es ist leider etwas kompliziert, hier mal stark vereinfacht:

er ist eine Liste von "Dingen", und zwar ist ein "Ding" entweder eine .jar Datei
oder ein ganz normaler Ordner

soweit so einfach

Wenn beim Übersetzen mit javac oder beim Ausführen einer Java-Klasse eine bestimmte .class Datei benötigt wird, dann gehen sowohl javac als auch java diese Liste durch und schauen, ob die .class Datei da irgendwo zu finden ist

gut ist, dass normalerweise das "aktuelle Verzeichnis" gleich mit drin ist in der Liste

CLASSPATH ist ein Dinosaurierer aus Java 1.1. Tagen, den kann man heutzutage normalerweise vergessen. Das ist tatsächlich auch eine Systemvariable (also in gewisser Weise ähnlich dem PATH), die auch bei der Suche verwendet wird

aber wenn da was drin steht und der Punkt vergessen wurde, dann ist natürlich das "aktuelle Verzeichnis" auf einmal nicht mehr drin
...

wenn man gerade keine IDE zur Hand hat, oder ein Start-Skript schreibt oder sonst was macht das nichts mit dem "Programmieren" zu tun hat, dann übergibt man den classpath IMMER als Argument

Code:
java -cp .;foo.jar;bar.jar  MeineMain.class

nur Anfänger und Hausfrauen legen ihre jar-Dateien in irgendein lib/ext weil dann - vermeintlich - alles ganz einfach wird :)
 
F

Florian Scheidler

Gast
OK, Leute danke für Eure Erklärungen. Eines würde mich aber noch interessieren:

Was ist der Nachteil daran, zu verwendende Jar-Archive im Ordner lib/ext zu hinterlegen? Ich meine so sehr wie ihr dagegen sprecht, muss es ja ziemlich von Nachteil sein.
Und nochmal zu meiner Entschuldigung: Ich kann Java programmieren, soweit so gut. Ich hab damit auch schon einige sehr schöne Tools für meine Firma programmiert und das meist in Rekordzeit (leider krieg ich meist nicht mehr Zeit). Sich jetzt auch noch mit der Java-Umgebung selbst super auszukennen und allem was dazu gehört, übersteigt dann doch meine zeitlichen Möglichkeiten (ein bischen Freizeit muss auch sein oder ;) ).
Zudem haben ja mit meinen kleinen Kenntnissen in Sachen Java-Umgebung immerhin an die zehn Java-Tools bisher für über 20 Benutzer funktioniert. Bis auf ein Tool bei dem münchner Benutzer ;)

Aber ich danke euch und mit Euren Erklärungen kriege ich das Ganze morgen hin!
 

Bleiglanz

Gesperrter Benutzer
Was ist der Nachteil daran, zu verwendende Jar-Archive im Ordner lib/ext zu hinterlegen?
der benutzer kann sein JRE nicht mehr deinstallieren und dann ein neues installieren

lib/ext würde total vermüllt wenn das alle machen

was, wenn eine Anwendung den mysql-treiber foo-1.1.1.jar und eine andere den treiber foo-1.3.5.jar verwenden will?

nicht alle Anwender sind Admins und können da überhaupt was reinkopieren, keiner könnte dann ein Programm "just so" starten

man kann java Programme einfach in ein .zip stecken und dieses deployen, wenn du jre/ext verwenden willst dann müsstest du ja WISSEN, wo auf dem zielrechner dieses Verzeichnis überhaupt ist

usw. usf
 

thE_29

Top Contributor
Die "leichteste" Methode ist zu sagen, alle Jar Archive sollen in dein Jar Archiv gleich mit reingepackt werden!


Dann hat man zwar ne 10 MB große Jar Datei (wenns viele ext. Klassen sind) aber man hat keine Probleme mit classpath etc.


Wenn du eine gute IDE verwendest (JBuilder, Eclipse) dann solltest du beim Jar erstellen auch irgendwo auswählen können, das er dir alle Abhängigkeiten oder einfach alles in das Jar File miteinbinden soll!
 
F

Florian Scheidler

Gast
OK, ich gebe euch Recht mit den Nachteilen von der Hinterlegung in lib/ext, aber für unsere Bedürfnisse hier in der Firma ist das nicht so wichtig, da sowieso wir Programmierer/Admins alles für die User einrichten. Die sollen und können sowas gar nicht selbst. Aber ihr hattet trotzdem Recht.

Allerdings hätte ich jetzt doch noch mal Fragen zum CLASSPATH:

Ist der CLASSPATH von Java dasselbe wie die Systemvariable CLASSPATH die ich mit "Set" in der Dos-Eingabeaufforderung sehe?

Wenn ja: Da bei dem Benutzer wo das Tool nicht läuft, im CLASSPATH schon was drinsteht:

Gilt die Angabe beim Aufruf von java -cp .PFADE oder ist sie unwirksam wenn im CLASSPATH direkt schon was drinsteht?

Grüße Florian Scheidler
 

Murray

Top Contributor
Ist der CLASSPATH von Java dasselbe wie die Systemvariable CLASSPATH die ich mit "Set" in der Dos-Eingabeaufforderung sehe?
Ja

Gilt die Angabe beim Aufruf von java -cp .PFADE oder ist sie unwirksam wenn im CLASSPATH direkt schon was drinsteht?
Die "-cp"-Option hat Priorität, in diesem Fall wird die Umgebungsvariable nicht ausgewertet
 

Bleiglanz

Gesperrter Benutzer
Die "leichteste" Methode ist zu sagen, alle Jar Archive sollen in dein Jar Archiv gleich mit reingepackt werden!
auch das ist nur für Standalone-Java-Applikationen möglich, für alles andere ist das eine Desasterquelle
 

thE_29

Top Contributor
Naja, und das meiste sind ja Standalone Apps ;)

Für gscheite Apps, gibts sowieso Installationssätze und da muss sich beim Installieren kümmern das alles passt und gesetzt ist!

Ansonsten, wenns kopiert wird, ist es das beste, alles in einem jar Archiv zu haben oder alles in einem Ordner zu haben und via bat Datei zu starten!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Thallius Rätsel für Windows Profis Allgemeine Java-Themen 8
S jni, für profis Allgemeine Java-Themen 3
D NoClassDefFoundError: Could not initialize class Allgemeine Java-Themen 0
G java.lang.NoClassDefFoundError: org/aspectj/lang/Signature Allgemeine Java-Themen 2
volcanos JavaFX-Programme nur in NetBeans selber ausführbar ! command_line: NoClassDefFoundError Allgemeine Java-Themen 39
S Compiler-Fehler NoClassDefFoundError Allgemeine Java-Themen 4
M NoClassDefFoundError Allgemeine Java-Themen 6
F Fehlermeldung: java.lang.NoClassDefFoundError: org/apache/commons/net/ntp/NTPUDPClient Allgemeine Java-Themen 6
T Compiler-Fehler NoClassDefFoundError beim Laden einer Class Allgemeine Java-Themen 11
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
C Hilfe bei NoClassDefFoundError Allgemeine Java-Themen 14
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
H Java Mail Fehlermeldung: java.lang.NoClassDefFoundError: javax/mail/internet/AddressException Allgemeine Java-Themen 5
Crooda Compiler-Fehler java.lang.NoClassDefFoundError bitcoinj Allgemeine Java-Themen 1
L Eigenener ClassLoader wirft java.lang.NoClassDefFoundError Allgemeine Java-Themen 0
A Classpath LWJGL+NiftyGui und der NoClassDefFoundError Allgemeine Java-Themen 1
S java.lang.NoClassDefFoundError Allgemeine Java-Themen 5
T NoClassDefFoundError... Allgemeine Java-Themen 5
G Json-Lib NoClassDefFoundError Allgemeine Java-Themen 3
T ProcessBuilder (java.lang.NoClassDefFoundError) Allgemeine Java-Themen 2
E NoClassDefFoundError: javax/microedition/io/Connection Allgemeine Java-Themen 2
P NoClassDefFoundError sigar Allgemeine Java-Themen 5
B NoClassDefFoundError Allgemeine Java-Themen 5
O NoClassDefFoundError Allgemeine Java-Themen 5
reibi NoClassDefFoundError abfangen Allgemeine Java-Themen 6
N NoClassDefFoundError bei JasperReports Allgemeine Java-Themen 2
G NoClassDefFoundError: java/lang/Object Allgemeine Java-Themen 4
S JOGL NoClassDefFoundError und Maven Allgemeine Java-Themen 4
G NoClassDefFoundError Allgemeine Java-Themen 3
M NoClassDefFoundError Allgemeine Java-Themen 9
E Java Fehlermeldung java.lang.NoClassDefFoundError Allgemeine Java-Themen 3
F NoClassDefFoundError Allgemeine Java-Themen 5
T NoClassDefFoundError, warum? Allgemeine Java-Themen 6
Jens Hibbeler Klasse Laden, aber wie? NoClassDefFoundError? Allgemeine Java-Themen 3
I Anwendung auf Netzlaufwerk von mehreren Usern gleichzeitig nutzbar. Allgemeine Java-Themen 3
W JNDI - LDAP - Probleme beim editieren von Usern Allgemeine Java-Themen 0
W Beziehungen zwischen Usern ermitteln Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben