# Eclipse: Jar-File durch Ant generieren?



## Flokati (28. Sep 2006)

Hi!

Durch "Export->Ant Buildfiles" kann man sich ja das Ant-File generieren lassen.
Schön, um verschiedene Klassen im Projekt starten zu können, aber was muss ich machen, wenn ich *.jar-Files generieren lassen möchte?


----------



## alehandro (29. Sep 2006)

einmal per Hand jar-File erstellen (Export ....) und das Häckchen für "Beschreibung derJar speichern" oder so ähnlich setzen


----------



## SamHotte (29. Sep 2006)

Du kannst einfach das build.xml selbst basteln, ist so schwierig nicht 

Wie man ant bedient, steht hier

Ein Beispiel für den JAR-Task:


```
<?xml version="1.0"?>
<project name="jar" default="default">
    <description>
    Kompiliert den aktuellen Stand des Projekts und verpackt ihn in ein .jar-Archiv
    </description>

    <target name="default">
        <jar destfile="c://zielverzeichnis/dateiname.jar" basedir="c://projektverzeichnis">
            <manifest>
                <attribute name="Built-By" value="Dein Name" />
                <attribute name="Main-Class" value="pfad.zur.MainKlasse" />
            </manifest>
        </jar>
    </target>
</project>
```


----------



## Flokati (30. Sep 2006)

Also das mit dem "einfachen" Export klappt!
Mit Ant ein kleines Projekt zu jarn klappt auch.

Aber jetzt ist mein Ehrgeiz geweckt:
Ich möchte gerne eine Libary (Jar-File) mit hineinpacken, und einen Ordner mit Bildern.
Das bekomme ich aber leider noch nicht hin :-(
Ich habe schon in den angegebenen Link auf der Apache Seite geschaut, aber trotzdem bin ich nicht schlauer geworden.


----------



## SamHotte (9. Okt 2006)

Da gibt's hier im Forum diverse Threads zu. Ein anderes Jar-File da mit hinein geht wohl nur über Umwege (FatJar oder sowas).
"Ordner mit Bildern": was klappt denn nicht, das einpacken oder das wieder herausholen?


----------



## corvettev1 (6. Aug 2009)

Hallo ich habe mir dieses "Build.xml" file mal angeschaut und versucht zu implementieren....

Hallo Wolfgang,

ich habe ein Problem mit "ANT"...

ich habe eine build.xml gebaut mit folgendem Inahalt:

<?xml version="1.0"?>
<project name="jar" default="default">
    <description>
    Kompiliert den aktuellen Stand des Projekts und verpackt ihn in ein .jar-Archiv
    </description>

    <target name="default">
        <jar destfile="UschE.jar" basedir="." includes="*/**">
            <manifest>
                <attribute name="Built-By" value="XXXXX" />
                <attribute name="Main-Class" value="src.main.Main" />
            </manifest>
        </jar>
    </target>
</project>

Ich bekomme folgenden Fehler:
C:\Users\-.-\Desktop>java -jar UschE.jar
Exception in thread "main" java.lang.NoClassDefFoundError: src/main/Main
Caused by: java.lang.ClassNotFoundException: src.main.Main
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Meth
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Sour
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: src.main.Main. Program will exit.

Ort der Main: Projekt/package=main/Klasse=Main

Ort der build.xml: gleiche Hierarchie wie src

Manifest Inhalt:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.0
Created-By: 14.0-b16 (Sun Microsystems Inc.)
Built-By: XXXX
Main-Class: src.main.Main

Kann mir jmd dabei helfen?


----------



## mvitz (6. Aug 2009)

main.Main anstelle von src.main.Main


----------



## corvettev1 (6. Aug 2009)

Hi,

das geht leider auch nicht...:-(((


----------



## Sergeant_Pepper (7. Aug 2009)

corvettev1 hat gesagt.:


> ```
> ...
> <target name="default">
> <jar destfile="UschE.jar" [color=red]basedir="."[/color] includes="*/**">
> ...



Bist du dir sicher, dass der Paket-Baum der class-Dateien passt?


----------



## corvettev1 (7. Aug 2009)

Mein Paketbaum sieht so aus:

-Projektname


----------



## corvettev1 (7. Aug 2009)

Mein Paketbaum sieht so aus:

-Projektname
---src
-----main
-------Main.java 

---build.xml

d.h build.xml ist auf der selbenen Ebene....

ansonsten verstehe ich deine Frage leider nicht....

Gruss & DANKE


----------



## Sergeant_Pepper (7. Aug 2009)

wo stehen denn die class-Dateien?

EDIT:
mit class-Dateien **könnte** deine Verzeichnisstruktur so aussehen:

- Projektname
---src
----- main
--------Main.java

---bin
----- main
--------Main.class

- build.xml


----------



## corvettev1 (7. Aug 2009)

Irgendwie komme ich grade ins schwanken....

sollte man nicht .java dateien ins .jar packen?
oder sind es nun die .class?

Das Projekt ist in Eclipse realisiert...weiss leider nicht arthock wo sich diese befinden, schätzungsweise im "bin" ordner...welcher aber im Eclipse Projektbaum nicht angezeigt wird.


Gruss & DANKE


----------



## Sergeant_Pepper (7. Aug 2009)

Du musst die class-Dateien ins jar packen...

Wo Eclipse die class-Dateien hinschreibt, kannst du über
Projekt --> "Properties" --> Tab "Source" --> "Default Output Folder" festlegen.

Falls in der Projektansicht Ordner nicht angezeigt werden, probier mal die View "Navigator", die ist recht zuverlässig.


----------



## corvettev1 (7. Aug 2009)

Danke für das Feedback...also ist mein Problem das ich .java reinpacken will und keine .class?

müsste dann also bin.main angeben, oder wie genau müsste ich das schreiben?


----------



## Sergeant_Pepper (7. Aug 2009)

Du musst dem Programm "jar" mitteilen, in welchem Verzeichnis das oberste Package deiner class-Dateien steht.

Angenommen, deine class-Dateien stehen in diesem Baum:
-Projekt
----bin
-------main
----------Main.class

----build.xml

Wenn "bin" nicht zu den Packages gehört, wovon ich ausgehe, dann ist "main" das oberste Package.
"build.xml" steht in "Projekt", nicht in "bin".

Als Basisverzeichnis für jar muss dann "bin" angegeben werden.


----------



## mvitz (7. Aug 2009)

Und als Startklasse main.Main


----------



## corvettev1 (8. Aug 2009)

Danke für die Zahlreichen Posts....aber leider geht es immernoch nicht....

aden/usche/bin/main/Main
Caused by: java.lang.ClassNotFoundException: de.informatik.fhwiesbaden.usche.bin
.main.Main
        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)
Could not find the main class: de.informatik.fhwiesbaden.usche.bin.main.Main. Pr
ogram will exit.

Dazu habe ich 2 verschiedene build.xml gebaut...:
1) Hier binde ich das manifest einfach nur ein:
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<project name="MeinProjekt" default="dist">

  <property name="MyApp" value="MeineAnwendung" />

  <path id="compile.classpath">
    <fileset dir="lib" />
    <pathelement path="bin" />
  </path>

  <target name="compile">
    <javac srcdir="src" destdir="bin">
      <classpath refid="compile.classpath" />
    </javac>
  </target>

  <!-- Create binary distribution -->
  <target name="dist" depends="compile">
    <delete file="${MyApp}.jar"/>
    <delete file="dist/${MyApp}.zip"/>
    <mkdir dir="dist" />
    <jar jarfile="${MyApp}.jar"
         basedir="." 
         manifest="manifest.txt" />

    <zip destfile="dist/${MyApp}.zip">
      <fileset dir="." includes="lib/*" />
      <fileset dir="." includes="${MyApp}.jar" />
    </zip>
  </target>
</project>
[/XML]

2) Bei dieser Variante erzeuge ich das manifest.txt gleich mit...

[XML]<?xml version="1.0" encoding="UTF-8"?>
<project name="jar" default="UschE">
    <description>
        Swt Projekt -UschE-    
        Ant Build-File zum erstellen der .jar
    </description>

	 <!-- - - - - - - - - - - - - - - - - - 
	          target: UschE
	          Jar Task, welcher das Projekt von "src" in "bin" erzeugt                      
	         - - - - - - - - - - - - - - - - - -->


	<target name="UschE">
		<!-- "bin ist ist der Quellordner, um die .class Dateien zu nehmen-->
		<javac srcdir="bin"
				         destdir="."
				         debug="on"
				    	/>

      	<jar destfile="UschEl.jar" basedir="." includes="*/**">
            <manifest>
           	 <!-- - - - - - - - - - - - - - - - - - 
           	          manifest: 
           	          Erzeugt das "Manifest" mit den folgenden Werten.                       
           	         - - - - - - - - - - - - - - - - - -->
                <attribute name="Built-By" value="xxxxx"/>

            	<!-- Definition des Pfades für die Main-->
               	<attribute name="Main-Class" value="de.informatik.fhwiesbaden.usche.main.Main"/>
            </manifest>
       	</jar>
   	</target>
</project>[/XML]

Ich habe nochmal drüber geschaut..."bin" ist der "src" ordner...hilft aber alles nichts...

hier mal die Ordnerstrukturen:

Anhang anzeigen 526

Anhang anzeigen 527

Anhang anzeigen 528

Dabei ist zu beachten, das ich alle Ordner die man hier sehen kann einbinden muss..wegen "bildern, lib, die .jars haben" usw....

Danke im Voraus für all die Mühen..
Gruss


----------



## mvitz (8. Aug 2009)

[XML]...
<jar jarfile="${MyApp}.jar"
         basedir="." 
         manifest="manifest.txt">
  <fileset dir="bin" includes="**/*.*" />
</jar>
...[/XML]

Versuche dies mal. Du musst die Class-Dateien direkt im Root des Jars haben. Da du diese aber in "bin" kompilierst und als basedir "." hast, wird der bin Ordner mit inkludiert, aber die .class Dateien liegen halt nicht direkt im Root (mit Package natürlich)

Edit: Und andere JAR Dateien mit in dein JAR packen, geht ohne weitere Unterstütung nicht.


----------



## Sergeant_Pepper (8. Aug 2009)

corvettev1 hat gesagt.:


> "bin" ist der "src" ordner...hilft aber alles nichts...



was bedeutet diese Aussage?



> java.lang.ClassNotFoundException: de.informatik.fhwiesbaden.usche.bin.main.Main



Diese Exception bedeutet, dass das bin-Verzeichnis immer noch zur Paketstruktur gehört, und das ist falsch.

Ich möchte habi55 nicht widersprechen oder Verwirrung stiften, aber du könntest auch das mal probieren:

```
<jar jarfile="${MyApp}.jar"
         basedir="bin" 
         manifest="manifest.txt">
</jar>
```

Das Fileset einfach weglassen und basedir auf "bin" setzen


----------



## mvitz (8. Aug 2009)

Wäre auch mein Vorschlag gewesen, dann sind aber die Bilder Ordner etc nicht mit drin


----------

