# JAR file erstellen



## k1ngarthur (8. Apr 2012)

Hallo,

ich habe ein größeres Java Projekt, welches ich bisher ausschließlich mit Eclipse zu einem runnable-jar-file exportiert habe.
Das funktioniert einwandfrei.

Ich möchte das jetzt aber gerne über die Konsole (Linux) machen, aber irgendwie bekomme ich jedes mal die Fehlermeldung, dass die Main Class nicht gefunden wurde.

Vielleicht kann mir da jemand helfen?

Ich habe das von Eclipse erstelle Konfigurationsfile für ant mal angehängt, da sollten alle parameter drin sein. Fragt sich nur, wie ich das auf der Konsole eingebe.


----------



## Gast2 (8. Apr 2012)

Kannst du mal die fertige Jar datei hochladen?

Ist dein Code mit Java7 kompiliert und du versuchst ihn mit Java6 auszuführen?


----------



## k1ngarthur (8. Apr 2012)

Ich compiliere in Eclipse auf 1.6.  7 ist gar nicht installiert

jar file liegt auf rapidshare: https://rapidshare.com/files/1386365768/agent_kiel_new.jar
da es hierfür zu groß ist. (ca. 500kb)


----------



## Gast2 (8. Apr 2012)

Funktioniert bei mir problemlos. Mit welchem Kommando startest du die Datei?


----------



## k1ngarthur (8. Apr 2012)

achso, das war die datei von eclipse.
hier die von der konsole: https://rapidshare.com/files/3177300628/agent_kiel.jar

habe die wi folgt erstellt: jar cvfm agent_kiel.jar MANIFEST *
in der MANIFEST steht: Main-Class: agenten_steuerung.Agent


----------



## Gast2 (8. Apr 2012)

Der Aufruf müsste passen, allerdings hast du die java Dateien in das jar file gepackt  Da gehören aber die class files rein.


----------



## k1ngarthur (8. Apr 2012)

wie mache ich das denn.
wenn ich statt dem * einfach *.class eingebe, dann bekomme ich die Fehlermeldung
[WR]*.class : Datei oder Verzeichnis existiert nicht.[/WR]


----------



## Gast2 (8. Apr 2012)

Du gehst einfach in den Ordner in dem deine class Files liegen und führst da dann dein Kommando aus.


----------



## k1ngarthur (9. Apr 2012)

ok.
habe das gemacht (siehe jar-file im Anhang)
Dann kommt jetzt folgende Fehlermeldung beim starten:

```
Exception in thread "main" java.lang.NoClassDefFoundError: javax/vecmath/Tuple2f
Caused by: java.lang.ClassNotFoundException: javax.vecmath.Tuple2f
	at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: agenten_steuerung.Agent. Program will exit.
```


----------



## GUI-Programmer (9. Apr 2012)

Ich habe zwar die Beiträge hier schon alle gelesen, beziehe mich jetzt aber mal ganz auf den Titel. Hatte anfangs auch Probleme beim Erstellen von Jars, daher habe ich mir mal folgendes zusammengeschrieben:

```
So wird eine Jar - Datei als normales Archiv in der Konsole erstellt:
jar cvf deinjarfile.jar ersteEinzubindendeDatei.dateiendung zweiteEinzubindendeDatei.dateiendung

So wird eine ausführbare Jar - Datei in der Konsole erstellt:
jar vcef DeineMainClass deinjarfile.jar DeineMainClass.class

So wird eine ausführbare Jar - Datei mit weiteren, evtl dazugehörigen Klassen und Datein in der Konsole erstellt:
jar vcef DeineMainClass deinjarfile.jar DeineMainClass.class DieDazugehoerigeKlasse.class WeiterDatei.endung EinOrdner
```


----------



## k1ngarthur (9. Apr 2012)

Ok.

habe jetzt im bin-Ordner des Eclipse projekts folgendes versucht:
jar vcef agenten_steuerung.Agent agent_kiel.jar agenten_steuerung/Agent.class *

gleiches Problem.
auch jar vcef Agent agent_kiel.jar agenten_steuerung/Agent.class *
brachte mich nicht weiter.

Hast du vielleicht ein konkretes Beispiel.
Die Main-Class liegt im Ordner agenten_steuerung
Andere Ordner müssen aber ebenfalls mit eingebunden werden.


----------



## GUI-Programmer (9. Apr 2012)

Hab das schon lange nicht mehr über die Konsole gemacht, aber ja vielleicht:

```
jar vcef agenten_steuerung.Agent agent_kiel.jar agenten_steuerung.Agent.class
```

Also immer Klassen die in einem Package liegen durch Punkttrennung ansprechen???


----------



## k1ngarthur (9. Apr 2012)

jar vcef agenten_steuerung.Agent agent_kiel.jar agenten_steuerung.Agent.class

muss jar vcef agenten_steuerung.Agent agent_kiel.jar agenten_steuerung/Agent.class
heißen, sonst wird die Datei nicht gefunden.
Ansonsten ändert sich nichts am Problem. ;(


----------



## k1ngarthur (9. Apr 2012)

hab's jetzt über eine konfigurationsdatei für apache-ant gemacht.
das behebt mein problem vorläufig, ändert aber nichts daran, dass es über die konsole nicht richtig geht.


----------



## Gast2 (9. Apr 2012)

Das geht über die Konsole auch. Eclipse oder Ant machen nichts anderes 



> Exception in thread "main" java.lang.NoClassDefFoundError: javax/vecmath/Tuple2f


Die Meldung heißt einfach nur dass du irgendwelche Abhängigkeiten nicht im classpath hast.


----------



## k1ngarthur (9. Apr 2012)

hi,

schon klar. aber wie genau mache ich das? habe das bisher nur über eclipse gemacht.


----------



## Gast2 (9. Apr 2012)

Du hast doch sicherlich irgendwo die jar Datei rumliegen in der die Klasse liegt (müsste vecmath sein). Beim Starten musst du die jar Datei dann im Classpath angeben:


```
java -cp dieVecmath.jar;deineJar.jar agenten_steuerung.Agent
```
Oder alternativ im Manifest das Class-Path Attribut richtig setzen. Dann ist dein jar file auch per Doppelklick startbar.


----------



## k1ngarthur (10. Apr 2012)

Sowas habe ich mir schon gedacht.
Ich möchte gerne ein ausführbares jar-file haben. Daher habe ich mal:
jar cvfm agent_kiel.jar MANIFEST bin/ ../Bibliotheken/bin/
versucht.
Funktioniert aber immer noch nicht. Die Main wird nicht gefunden:
[WR]
Exception in thread "main" java.lang.NoClassDefFoundError: agenten_steuerung/Agent
Caused by: java.lang.ClassNotFoundException: agenten_steuerung.Agent
	at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: agenten_steuerung.Agent. Program will exit.
[/WR]

Das so erstelle jar-file hängt an.
Das mit ANT erstellte ist unter https://rapidshare.com/files/3177300628/agent_kiel.jar

In der ANT-Konfiguration steht:
[XML]
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="create_run_jar" name="Create Runnable Jar for Project Agent Kiel">
    <!--this file was created by Eclipse Runnable JAR Export Wizard-->
    <!--ANT 1.7 is required                                        -->
    <target name="create_run_jar">
        <jar destfile="agent_kiel.jar" filesetmanifest="mergewithoutmain">
            <manifest>
                <attribute name="Main-Class" value="agenten_steuerung.Agent"/>
                <attribute name="Class-Path" value="."/>
            </manifest>
            <fileset dir="bin"/>
            <fileset dir="../Bibliotheken/bin"/>
            <zipfileset excludes="META-INF/*.SF" src="../Bibliotheken/fenster.jar"/>
            <zipfileset excludes="META-INF/*.SF" src="../Bibliotheken/graphik_steuerelemente.jar"/>
            <zipfileset excludes="META-INF/*.SF" src="../Bibliotheken/vecmath.jar"/>
            <zipfileset excludes="META-INF/*.SF" src="../Bibliotheken/xml_klassen.jar"/>
            <zipfileset excludes="META-INF/*.SF" src="../Bibliotheken/clientview.jar"/>
        </jar>
    </target>
</project>
[/XML]

Die beiden jar-files unterscheiden sich sowohl in der Dateistruktur, als auch im Manifest.
Irgendetwas scheint also beim Konsolenaufruf noch zu fehlen.


----------



## GUI-Programmer (10. Apr 2012)

Habe gerade mal deine Jar runtergeladen und entpackt. Danach habe ich mal versucht deine Main Klasse Agent auszuführen. Folgende Exception:

```
C:\Users\Username\Desktop\bin>java agenten_steuerung.Agent
Exception in thread "main" java.lang.NoClassDefFoundError: javax/vecmath/Tuple2f
// etc.
```

Grund dafür ist, dass bei deinen Bibliotheken die dazugehörige Jar fehlt.
[EDIT]
Somit müsstest du das ganze dann per Konsole ausführen:

```
jar vcef agenten_steuerung.Agent agent_kiel.jar agenten_steuerung\Agent.class 
agenten_steuerung\BotAgent.class agenten_steuerung\config\ServerConfig.class /*alle weiteren .class Dateien*/ 
deineBibliothek1.jar deineBibliothek2.jar /*alle weiteren Jars/Zips*/
```
[/EDIT]


----------

