# Lauffähige JAR-Datei erstellen mit Eclipse



## JSteinhilber (29. Mrz 2008)

Hallo an alle Eclipse-Benutzer.

Mit Eclipse gibt es ja 2 Möglichkeiten des Exports. Einmal die Option "JAR file" und dann noch die Option "Runnable JAR" file.

Wird ein lauffähgies JAR file ausschließlich über letztgenannte Option erstellt, oder kann dies auch mit der Option "JAR file" durchgeführt werden?

Erstelle ich mein JAR file mit "Runnable JAR" ist die JAR-Datei ca. 7,5MB groß. Offensichtlich werden alle externen JAR-Archive die ich im BuildPath angegeben habe mit eingebunden. 
Die JAR-Datei läßt sich problemlos starten, ist jedoch riesengroß und es sind Bibliotheken eingebunden die nicht von mir sind (rechtliches Problem??).

Mit der ersten Option, also nur "JAR file", beträgt die Größe der generierten Datei lediglich 580KB.
Aber: Die kleine JAR-Datei läßt sich nicht starten und meldet mir ständig:
"Could not find the main class" trotz existierender MANIFEST.MF mit dem Inhalt

```
Manifest-Version: 1.0
Sealed: true
Main-Class: hauptFenster.Reha
```

und einer existirenden .classpath Datei deren Inhalt so aussieht:

```
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="src" path="src"/>
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/swt-debug.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/adsjdbc.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/Filters.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/forms-1.2.0.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/jmock-1.1.0RC1.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/junit-4.0.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/junit-4.0-src.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/JXLayer-2008_03_02.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/looks-2.1.4.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/MultipleGradientPaint.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/mysql-connector-java-5.1.5-bin.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/swing-layout.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/swing-worker.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/swingx-2008_03_02.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/swt.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/openofficeorg/unoil.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/openofficeorg/ag.ion.noa_2.1.0.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/openofficeorg/bion_jurt-2.0.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/openofficeorg/java_uno.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/openofficeorg/java_uno_accessbridge.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/openofficeorg/juh.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/openofficeorg/junit-3.8.1.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/openofficeorg/jut.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/openofficeorg/registry-3.1.3.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/openofficeorg/ridl.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/openofficeorg/sandbox.jar"/>
	<classpathentry kind="lib" path="C:/RehaVerwaltung/RTAJars/openofficeorg/bion_officebean-2.0.jar"/>
	<classpathentry kind="output" path="bin"/>
</classpath>
```

Etwas ratlose Grüße an alle
Jürgen


----------



## Wildcard (29. Mrz 2008)

Der 'Runnable' Export ist wohl von irgendeinem PlugIn. Der normale weg ist export -> jar file, main class angeben und dann solltest du es starten können.
Am besten du startest von der Konsole, damit du die Exceptions siehst.


----------



## JSteinhilber (29. Mrz 2008)

Hallo Wildcard,

geht leider nicht!
Ich habe die MainClass angegeben und trotzdem will er nicht.

Wenn ich die reha.jar mit dem Kommando javaw -jar reha.jar starte erhalte ich sofort ein WindowsFenster mit der Meldung daß die MainClass nicht gefunden werden konnte.

Starte ich mit java -jar reha.jar erhalte ich folgende Fehlermeldung


```
C:\RehaVerwaltung>java -jar reha.jar
Exception in thread "main" java.lang.NoClassDefFoundError: ag/ion/bion/officelay
er/application/OfficeApplicationException
Caused by: java.lang.ClassNotFoundException: ag.ion.bion.officelayer.application
.OfficeApplicationException
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
```

Was mich stutzig macht, sowohl im root-Verzeichnis des Archives als liegt eine MANIFEST.MF, als auch in einem Unterverzeichnis des Archives mit Namen META-INF...

Der Inhalt der beiden MANIFEST.MF ist aber identisch.


```
Manifest-Version: 1.0
Sealed: true
Main-Class: hauptFenster.Reha
```


Da versucht man sich nun wochenlang in Sachen Java abzumühen, hätte dann gerne eine lauffähige Version des geistigen Ergusses - und was ist?
Nix ist - auch schade eigentlich.

Gruß
Jürgen


----------



## Wildcard (29. Mrz 2008)

Die Main Class ist nicht das Problem, die Bibliotheken fehlen:
Caused by: java.lang.ClassNotFoundException: ag.ion.bion.officelayer.application 
Alle benötigten Bibliotheken müssen im Classpath liegen (im Manifest eintragen)


----------



## JSteinhilber (29. Mrz 2008)

> Alle benötigten Bibliotheken müssen im Classpath liegen (im Manifest eintragen)


????
Tja da staunt der Laie und der Fachmann wundert sich - ich staune....

Wie lautet denn die Syntax für solch einen Eintrag, etwa so?

```
Manifest-Version: 1.0
Sealed: true
Main-Class: hauptFenster.Reha
Classpath: RTAJars/openofficeorg/ag.ion.noa_2.1.0.jar 
RTAJars/openofficeorg/java_uno_accessbridge.jar 
etc...
```

Ich dachte es genügt wenn die externen JAR's im BuildPath von Eclipse eingetragen werden und der Rest wird von Eclipse organisiert.

Gruß 
Jürgen


----------



## Wildcard (29. Mrz 2008)

Wie soll Eclipse denn wissen wo die Bibliotheken später liegen werden?


----------



## JSteinhilber (29. Mrz 2008)

Das ist richtig, aber im BuildPath werden die Bibliotheken ja mit Pfad eingetragen und meine "nicht lauffähige" Jar liegt in derselben Pfadstruktur - aber sei's drum.

Ist die von mir oben aufgeführte Syntax völlig neben der Spur oder könnte es so hinhauen?

Grüße
Jürgen


----------



## JSteinhilber (30. Mrz 2008)

Problem behoben!

Zuerst habe ich, wie in einigen Beiträgen beschrieben, die ganzen jars in einer Zeile aufgeführt.
Ergebnis: beim Versuch meine Jar zu erstellen -> line too long!

Dann habe ich jedes jar-Archiv in einer neuen Zeile aufgeführt: ebenfalls Fehlermeldung, irgend etwas war "korrupt".

Dann habe ich jede neue Zeile mit einem Leerzeichen begonnen: wieder Fehlermeldung, ich glaube dann hatte er wieder die MainClass nicht gefunden.

Der Trick bestand letzlich darin jede Zeile mit einem Leerzeichen enden zu lassen.

Weshalb das so ist? Keine Ahnung, aber es funktioniert definitiv nur auf diese Weise.
Zumindest mit meiner Eclipse-Installation.

Das ganze sieht jetzt so aus:

```
Manifest-Version: 1.0
Sealed: true
Main-Class: hauptFenster.Reha
Class-Path: RTAJars/adsjdbc.jar<Leerzeichen> 
RTAJars/Filters.jar<Leerzeichen> 
RTAJars/forms-1.2.0.jar<Leerzeichen> 
RTAJars/jmock-1.1.0RC1.jar<Leerzeichen> 
RTAJars/junit-4.0.jar<Leerzeichen> 
RTAJars/junit-4.0-src.jar<Leerzeichen> 
...etc
```

Gruß
Jürgen

Edit: So und jetzt sind die Umleitungen der OOo-Events an der Reihe. Und wenn das erledigt ist, dann habe ich mein Sonntags-Pensum erfüllt!


----------

