# jar-datei auf anderem Rechner nicht ausführbar.



## sunnyMD79 (17. Jul 2007)

Hallo zusammen,

ich habe auf meinem Rechner in Eclipse eine jar-datei von meinem Programm erzeugt. Die jar-datei ist auch ausführbar auf meinem Rechner.
Dann habe ich die datei auf einen anderen Rechner kopiert, und wenn ich sie dort ausführe, bekomme ich die Fehlermeldung: "Could not find main class. ... exit."

Woran liegt das? 

Ist die Bauart des jar-Archivs vielleicht vom JDK abhängig? ich habe jre1.6.0_01, also sehr neu.


----------



## nbkr (17. Jul 2007)

Wie "startest" Du denn die Jar Datei auf deinem Rechner und auf dem anderen?


----------



## sunnyMD79 (17. Jul 2007)

einfach per Doppelklick.


----------



## mikachu (17. Jul 2007)

java -jar datei.jar


----------



## sunnyMD79 (17. Jul 2007)

Okay,

dann bekomme ich eine Exception "java.lang.UnsupportedClassVersionError: Bad version number in .class file" auf dem Fremdrechner.

Liegt das daran, dass dort die jre- version zu alt ist?


----------



## sunnyMD79 (17. Jul 2007)

also doch am besten wie in den FAQ's beschrieben auf CD brennen?!?


----------



## merlin2 (17. Jul 2007)

Nein, nicht mit 1.6 kompilieren! Es gibt beispielsweise eine javac-Option, die 1.4-Bytecode generiert.
Edit: Stimmt, Bytecode.   Habs geändert.


----------



## Murray (17. Jul 2007)

javac -target 1.4 <source-file(s)> erzeugt 1.4-kompatiblen *Byte*code


----------



## tuxedo (17. Jul 2007)

Ah, das ist interessant. D.h. ich kann trotzdem alle Java 6 Code-Features nutzen und bin dennoch abwärtskompatibel zu jre 1.4?

Oder muss mein Code dann auch 1.4 kompatibel sein?


----------



## thE_29 (17. Jul 2007)

3mal darfste raten 

Wie sollen den in der 1.4er JRE die von 1.5 schon nix mehr versteht Code Features von 1.6 verstehen? 

Nein, dann musst du auch 1.4 kompatibel programmieren (was ich meistens mache).
Bei Webservices kommt man um 1.5 nicht mehr rum, wegen den Generics und Annotationen.. 
Wohingegen 1.6 schon coole Features ala trayicon und der Desktop Klasse bietet


----------



## Murray (17. Jul 2007)

alex0801 hat gesagt.:
			
		

> Ah, das ist interessant. D.h. ich kann trotzdem alle Java 6 Code-Features nutzen und bin dennoch abwärtskompatibel zu jre 1.4?
> 
> Oder muss mein Code dann auch 1.4 kompatibel sein?



Wenn man -target 1.4 angibt, muss man auch -source 1.4 (oder niedriger) angeben; die Target-Version darf nicht niedriger als die Source-Version sein.


----------



## tuxedo (17. Jul 2007)

Okay, doch kein so dolles Feature :-(


----------



## L-ectron-X (17. Jul 2007)

Doch, nur so wird ein mit Java >= 1.5 kompilierter Code auch auf JREs früherer Bauart ausführbar.
Man braucht also nicht unbedingt ein weiteres JDK installiert haben, muss aber Ziel-JRE-kompatibel programmieren.


----------



## Murray (17. Jul 2007)

L-ectron-X hat gesagt.:
			
		

> Man braucht also nicht unbedingt ein weiteres JDK installiert haben, muss aber Ziel-JRE-kompatibel programmieren.


Zumal die alten JDKs <= 1.3 von Sun nicht mehr supported werden. Die Abwärtskompatibiliät der neuen JDKs ist aber ein aktuelles Feature und somit wohl noch in der Wartung. Sofern es um wichtige Anwendungen geht, kann das für manche Unternehmen schon wichtig sein.


----------



## pocketom (18. Jul 2007)

Ich habe das problem auch, allerdings ist auf allen beteiligten Rechnern 1.4.2 installiert. Entwickelt habe ich unter java version "1.4.2" gij (GNU libgcj), version 4.1.1 20070105. Auf den anderen Rechnern ist immer mindestens 1.4.2 installiert allerdings (GCC), z.B. java version "1.4.2"
gcj (GCC) 3.4.3 20041212 (Red Hat 3.4.3-9.EL4).

Dort bekomme ich dann auch "Exception in thread "main" java.lang.NoClassDefFoundError: myApp.jar". Auf einem Rechner sogar noch zusätzlich "Warning: -jar not understood. Ignoring.", worüber leider weder hier noch auf Google etwas zu finden ist weswegen ich grad sehr irritiert bin.

Gibt es eine Methode die jar mit allen Rechnern auf denen (irgend)ein Java ab 1.4.2. aufwärts installiert ist kompatibel zu machen?


----------



## tuxedo (18. Jul 2007)

Gibt es einen speziellen Grund warum du die SUN JRE meidest?


----------



## pocketom (18. Jul 2007)

Ja, ich muss hier auf einem Rechner entwickeln für den ich keine root-Rechte habe. Wie und ob ich es ohne installiert bekomme weis ich immer noch nicht so ganz, ich habe nur gelsen das ich das SUN JDK irgendwie im Eclipse Ordner platzieren muss, aber dann ist das JRE ja immernoch GNU...  Würde es auch gern loswerden, aber der zuständige "Systemadministrator" ist so ne selbsternannte Wichtigtuerpfeife, kriegt einfach nix auf die Reihe... Hast du eine Idee wie ich auch ohne ihn auf SUN umsteigen kann (sowohl mit dem JDK als auch mit dem JRE).


----------



## tuxedo (18. Jul 2007)

?? Einfach die .bin File bei SUN runterladen und dann im User-Homeverzeichnis ausführen/entpacken. Das ganze muss nicht in irgendein Systemverzeichnis rein wozu man root-rechte braucht. Home-Verzeichnis reicht aus. Dann nur noch die notwendigen Umgebungsvariablen zum jave/bin-direktory deines JDKs setzen und gut is...

Eclipse nimmt, soweit ich weiß, das erst beste JRE/JDK das es laut Umgebungsvariable findet. Und selbst wenn's das falsche wählt: In Eclipse kannst du immer noch das JDK das zum compilieren eingesetzt wird konfigurieren.

- Alex


----------



## pocketom (19. Jul 2007)

Hi, also, habe mir j2sdk-1_4_2_15-linux-i586.bin runtergeladen und in meinem home Verzeichnis entpackt.

dann habe ich in die .bashsrc im home dir folgendes eingetragen:

# Sun Java 1.4.2
#

JAVA_HOME=/home/gde12linux/j2sdk1.4.2_15;export JAVA_HOME;
PATH=$PATH:$JAVA_HOME/bin;export PATH;
CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar;export CLASSPATH;

(Das hab ich so beim googeln und beim suchen hier im Forum gefunden)

Leider zeigt sich aber wenn ich java -version in der Konsole ausführe keinerlei Veränderung. Da steht immernoch GNU  ???:L

Habe dass dann anschliessend wieder gelöscht und mir die RPM Version (j2sdk-1_4_2_15-linux-i586-rpm.bin) geholt und den Admin genötigt es als root auszuführen. Ist aber immernoch GNU mit java -version  :bahnhof:



EDIT: Wie schau ich denn nach welche Java version das Eclipse verwendet?


----------



## tuxedo (19. Jul 2007)

da stimmt was mit deinem pfad nicht...
du exportierst auch das bestehende JAVA_HOME und den bestehenden PATH mit. D.h. wenn da schon eins drin steht, stehen nachher 2 drin.

Was erscheint denn wenn du direkt im BIN-Verzeichnis versuchst java auszuführen?

Und nochmal: Es ist absolut Bums mit welcher der installierten Java-Versionen Eclipse startet. Du kannst das JDK das für's compilieren benutzt werden soll (und dafür muss nichtmal PATH gesetzt sein) angeben.

Entweder stellst du dich etwas ungeschickt an oder wir reden aneinander vorbei.

- Alex


----------



## pocketom (19. Jul 2007)

Also, 

in der PATH steht am Ende genau einmal "/home/gde12linux/j2sdk1.4.2_15/bin". doppelt ist da nix, wird ja auch nur den bestehenden PATH Einträgen angehängt. 

Auch CLASSPATH enthält nix doppelt, auch wenn ich die Konsole mehrmals starte, steht alles nur einmal drin: 
CLASSPATH=/home/gde12linux/j2sdk1.4.2_15/jre/lib:/home/gde12linux/j2sdk1.4.2_15/lib:/home/gde12linux/j2sdk1.4.2_15/lib/tools.jar

Ebenso, mit JAVA_HOME, nur ein Eintrag. Komischerweise ändert es nix wenn ich die exports wegnehme  ???:L 


Nun ja, ich habe jetzt sämtliche Settings in Eclipse durch, ich finde nur unter JAVA-Installed JREs das ich JRE umschalten kann. Dabei habe ich zufällig auch entdeckt das auf dem Rechner an dem ich sitze unter usr/lib/ alle möglichen JREs liegen, z.B. 1.4.0, 1.4.2, 1.5.0, 1.6.0 (warum ich mittels java -version 1.4.2. GNU angezeigt bekomme, bzw. wo dass festelegt wird ist mir nach wie vor ein Rätsel). unter usr/lib/jvm/ liegen auch welche, aktuell ist java-1.4.2-gcj-1.4.2.0 unter JAVA-installed JREs eingetragen. Ansonsten finden sich in diesem Ordner noch die Unterordner jre, jre-1.4.2, jre-1.4.2-gcj, jre-gcj.

Um ganz ehrlich zu sein, ich blick jetzt gar nicht mehr durch   Wo stell ich das zu verwendende JDK zum Kompilieren ein? und wie ersetze ich auf der Kiste generell das GNU 1.4.2 JRE durch ein SUN (z.B. das aktuelle?). Das GNU soll ganz weg!


----------



## tuxedo (19. Jul 2007)

Kann man bei den Build-Path-Einstellungen konfigurieren:




Geht auch über den Preferences-Dialog in Eclipse

- Alex


----------



## pocketom (19. Jul 2007)

Ahhhhh  Danke!

Ich hab immer nach JDK Optionen gesucht... Ich probier mich da grade mal durch...


Wegen der Java Version die ich auf dem System angezeigt bekomme, wie stell ich das system generell um auf eine andere Version? Das will einfach nicht klappen. Das wäre einfach auch wichtig um zu testen ob das was ich kompiliere überhaupt ausserhalb der IDE läuft..Zzudem möchte auf allen Rechnern die hier stehen das GNU loswerden und eine einheitliche Version auf allen Kisten haben. Bist du sicher das man nicht doch root Rechte dafür braucht?

Nun, hier die 3 Systemvariablen die ich in .bashsrc gesetzt habe, so wie sie mir angezeigt werden wenn ich "set" ausführe:

CLASSPATH=/home/gde12linux/j2sdk1.4.2_15/jre/lib:/home/gde12linux/j2sdk1.4.2_15/lib:/home/gde12linux/j2sdk1.4.2_15/lib/tools.jar
PATH=/usr/local/bin:/usr/bin:/home/gde12linux/bin:/home/gde12linux/j2sdk1.4.2_15/bin
JAVA_HOME=/home/gde12linux/j2sdk1.4.2_15

entpackt habe ich nochmal alles manuell in /home/gde12linux/j2sdk1.4.2_15, denn das rpm hat leider garnichts gemacht(root-rechte?). Ich sehe bei den systemvariablen irgendwie nichts widersprüchliches, fällt dir was auf? Fehlt da evtl. noch ein Eintrag oder so?


----------



## tuxedo (19. Jul 2007)

Mir fällt  da gerade was ein:

Manche Distributionen legen Symlinks zu den JRE's an..
Diese sollten sich irgendwo in /usr/local/bin oder /usr/bin befinden...

Da diese zwie Pfad VOR Java im PATH stehen, wird, wenn dort ein Symlink vorhanden ist, natürlich  die Variante ausgeführt die zuerst im PATH gefunden wurde...

Kannst ja mal die Reihenfolge im Path umdrehen und schauen obs besser wird.

Und Root-Rechte braucht man definitiv nicht. Ich habs ja selbst ohne gemacht.

- Alex


----------



## pocketom (19. Jul 2007)

Ok, alles klar. Danke für den Tip, an Symlinks hat ich noch garnicht gedacht. Im Moment kämpfe ich damit mein Projekt mit dem SUN JDK das ich im Build Path eingetragen habe zum laufen zu bringen. Das alte was da drin war, hab ich mal ganz rausgeschmissen.

Error: 
The project was not built since its build path is incomplete. 
Cannot find the class file for java.lang.Object. 
Fix the build path then try building this project


Ich habe unter Build Path / Libraries den root Folder von dem Sun JDK eingetragen das ich in mein Homeverzeichnis entpackt habe, man soll ja laut dem Optionsmenu das "JRE home directory" eintragen. Scheint aber nicht so ganz das ware zu sein.


----------



## Murray (19. Jul 2007)

pocketom hat gesagt.:
			
		

> Ich habe unter Build Path / Libraries den root Folder von dem Sun JDK eingetragen das ich in mein Homeverzeichnis entpackt habe, man soll ja laut dem Optionsmenu das "JRE home directory" eintragen. Scheint aber nicht so ganz das ware zu sein.



Versuch mal das jre-Unterverzeichnis unterhalb des JDK-Folders.


----------



## pocketom (19. Jul 2007)

Geht leider auch nicht. Eclipse findet in diesem Ordner selbst die System Libraries dnsns.jar, ldapseq.jar, sunjce_provider.jar


----------



## tuxedo (19. Jul 2007)

So sieht's bei mir aus:





Wo genau das JDK liegt ist wurscht. Hauptsache es wurde korrekt angegeben WO.

Und noch n tipp: versuchs nicht nur für das eine Projekt einzustellen, probuers für ganz eclipse übr "Window" -> Preferences" -> "Java" -> "Installed JREs"

- Alex


----------



## Guest (20. Jul 2007)

genau das hab ich schon gemacht gestern, habe mich einfach dort hingebrowsed:






Es geht einfach nicht. So langsam nervts mich voll an...


----------



## tuxedo (20. Jul 2007)

Ähm, hast du mal verglichen was in meinem Screenshot für ein Pfad angegeben ist und was du bei dir angegeben hast? Mein Pfad zum "JRE Home Directory" endet nicht in einem Unterverzeichnis namens "jre". 

Bei mir sind, vermutlich wegen der "korrekten" Pfadangabe auch mehr Libraries aufgeführt als bei dir. Bei dir sinds ja nur 3 ?!

- Alex


----------



## Guest (20. Jul 2007)

Genau das hab ich ja bereits gestern ausprobiert, bevor du meintest ich soll mal das Unterverzeinnis "jre" testen ;-) Geht beides nicht. Ich lad mal eine andere JAVA Version runter.


----------



## tuxedo (20. Jul 2007)

Der Vorschlag mit dem "jre" kam nicht von mir. 

- Alex


----------



## Guest (20. Jul 2007)

Ah ok, stimmt, sorry!


----------



## pocketom (20. Jul 2007)

Also so langsam geht es mir voll auf den Keks. Ich habe jetzt je 3 Versionen JREs und JDKs (J2SDK, SDK, Unterschied zu JDK?) runtergeladen und es mit allen 6 in allen erdenklichen Varianten versucht. Ich peils einfach nicht. Der Menüpunkt heisst "Installed *JREs*". Also muss ich doch wohl davon ausgehen das ich hier auch nur das zum Starten der Programme zu verwendende *JRE* bzw. dessen Location angeben/konfigurieren soll. 

Allerdings meldet Eclipse bei jedem JRE Rootfolder das ich ihm angebe:

Target is not a *JDK *root. System library was not found.

Ja was denn nun, JRE oder JDK????? Da weiss einer von Eclipse glaub ich nicht so ganz was er dem user vermitteln wollte. Ich denke der Widerspruch ist irgendwie offensichtlich.


Nun, gebe ich ihm den "j2sdk1.4.2_15" folder, so wird dieser ohne diese Fehlermeldung akzeptiert, jedoch werden nur besagte 3 Librarys drin gefunden. 

Adde ich den Folder "jdk1.6.0_02" so heisst es wieder: Target is not a JDK root. System library was not found.



Ich werf die Ksite echt gleich aus dem Fenster (nein, der kann ja eigentlich garnix dafür...).  :x


----------



## tuxedo (20. Jul 2007)

Hast du mal in deinem JDK-Ordner nachgesehen, ob die Libs, die bei mir im Screenshot aufgeführt sind, auf der Platte überhaupt vorhanden sind? Haben die die richtigen Dateirechte? 

- Alex


----------



## pocketom (20. Jul 2007)

Ich glaube es hat endlich hingehaun. Ich habe mir jetzt endlich root-Rechte erkämpft. Und siehe da, das rpm hat sich vernünftig installiert. Die jars die gefehlt haben liegen jetzt unter usr/java und mit denen kann Ecplipse auch was anfangen. Wahrscheinlich liegts an irgendwelchen Rechten o.Ä., ich hab keine Ahnung warum das mit entpacken ins home Verzeichnis nicht gegangen ist. Ich kann also nur jedem empfehlen der keinen Stress haben will, sich als root anzumelden und das rpm auszuführen.

So, natürlich gehn die probleme jetzt erst los, aber das war ja zu erwarten. Viele Klassen die ich mit 1.4.2 GNU eingesetzt habe schmecken dem SUN v6.2 nicht. Das muss ich jetzt erstmal analysieren.


----------



## tuxedo (23. Jul 2007)

wie gesagt, ich hab immer die BIN-Files von der Sun-Seite gezogen und die dann ausgeführt. Das Ding hat sich dann im selben Verzeichnis entpackt. Und es war alles dabei was man gebraucht hat. 

- Alex


----------



## pocketom (24. Jul 2007)

Danke für den Tip mit den Symlinks. Habs jetzt an den Anfang meiner PATH gestellt, und jetzt läuft JRE 6u2 auch bei mir. Leider das JAR File das ich mit dem JDK6 kompiliert hab noch nicht aber.... mal schaun, das wird schon auch irgendwie.


----------



## tuxedo (24. Jul 2007)

? Das mit den Symlinks und das mit dem "an den Anfang stellen" hatte ich doch schon vor 5 Tagen gepostet? Hattest du das etwa überlesen?

- Alex


----------



## pocketom (25. Jul 2007)

Ja, das ging bei mir irgendwie unter. Ich habs denn erst über die Boardsuche wiederentdeckt, nachdem ich mich erstmal voll reingestresst hab warum die Änderung von PATH und CLASSPATH nix bewirken  :lol:


----------



## tuxedo (25. Jul 2007)

"aufmerksames lesen" hat schon was für sich


----------

