# (Eclipse)Ant Script, .jar Datei erstellen mit MANIFEST.MF



## prototype0815 (20. Dez 2013)

Servus und Hallo,

also ich suche nunmehr schon seit ca. 2 Tagen nach einer Lösung für mein Problem. ich bin Java Entwickler und entwickle mit *Eclipse *(Version: Kepler Service Release 1 Build id: 20130919-0819).

wir benötigen geschäftlich von unseren Java Projekten eine .jar datei um das Applet z.B. im Browser zu starten. Wenn ich nun mittels Eclipse eine .jar Datei erstelle, mit "*Export*" und dort meine MANIFEST.MF angebe wird die .jar genau so erstellt wie wir sie benötigen.

Meine Aufgabe ist nun mittels *Ant-Script* diese funktion nach zu bauen, sodass diese .jar 
*1. nicht von hand erstellt werden muss* und *2. soll sie bei jedem "Clean" bzw "Build" erstellt werden.*

Ich schaffe es nun schon mit hilfe von einer build.xml (die autom. als ant script ausgeführt wird) und {meinProjekt} --> "Properties" --> "Builders" --> "new Ant Build", dass meine .jar datei erstellt wird und bei jedem "Clean, Build" ausgeführt wird.
*
hier meine Ordner Struktur:*






*hier der inhalt meiner build.xml*
[XML]<?xml version="1.0"?>
<project name="make jar" default="jarbuilder">																<!-- default gibt das "default" target an -->
    <description>
    Kompiliert den aktuellen Stand des Projekts und verpackt ihn in ein .jar-Archiv
    </description>

    <target name="jarbuilder">
        <jar destfile="maxi66.jar" basedir="bin" excludes="*.html,*.applet, *.jbx, *.MF">
        </jar>
    </target>
</project>[/XML]
ich habe nun mal nur den source code drin gelassen der sicher funktioniert, wie man in der Ordner Struktur sieht liegt meine MANIFEST.MF direkt im Projekt-Ordner und soll nach der erstellung der .jar datei im *META-INF* Ordner liegen


*hier mall eine entpackte .jar datei, die mittels "Export" erstellt wurde*





die beim Export angegebene MANIFEST.MF liegt hier schon im META-INF ordner.


was ich schon ausprobiert habe ist: Manifest generieren lassen nach meinen Vorstellungen, metainf + Manifest generieren, vorhandene Manifest in META-INF kopieren lassen, aber nichts hat geholfen.

Hoffentlich sind meine Angaben detailliert genug, falls nicht bitte bescheid geben. 
Ich würde mich riesig freuen wenn ihr mir helfen könnt. :toll:

p.s. Ich bin totaler anfänger was XML-Scripte angeht und hab auch keine Ahnung von Ant Scripten, falls es da überhaupt einen unterschied gibt. :bahnhof:

Vielen Dank
Gruß proto


----------



## prototype0815 (20. Dez 2013)

*EDIT:*

ich glaubs nicht, kaum ein Forums-post eingestellt schon funktioniert es. Ich kann auch nicht sagen warum es geht, ich hab nämlich meinen Quelltext von gestern Mittag nochmal rein kopiert aber nichts dran geändert und siehe da, es geht !!

.jar wird erstellt, mit META-INF ordner, und eine MANIFEST.MF wird darin generiert :toll:


*jetzt muss ich folgende erweiterung schaffen, .jar generieren und vorhandene MANIFEST.MF in den META.INF hinein kopieren.*


----------



## prototype0815 (8. Jan 2014)

*jetzt muss ich folgende erweiterung schaffen, das Ant Script soll eine .jar generieren und vorhandene MANIFEST.MF automatisch in den META.INF hinein kopieren lassen.*

bin noch nicht weiter gekommen...sieht aus als hätte niemand ne Idee für mich ;(


----------



## knilch (9. Jan 2014)

Hi,
Frage:
Du schreibst, dass Manifest.mf im Projektordner ist, wieso machst, du einen exclude im jarbuilder- target?


> <target name="jarbuilder">
> <jar destfile="maxi66.jar" basedir="bin" excludes="*.html,*.applet, *.jbx, *.MF">
> </jar>
> </target>


Das Manifest.mf kannst du mit 
[XML]
<copy todir="${release.dir}/">
   <fileset dir="${src.dir}/" includes="**/*.mf"/>
</copy>
[/XML]
in das Verzeichnis META-INF kopieren. Wobei {release.dir} das Verzeichnis ist, welches erstellt wird (z.B. META-INF) und {src.dir} das Verzeichnis ist, wo manifest.mf abgelegt ist.


----------



## prototype0815 (9. Jan 2014)

hi, also wie man in meiner Ordner Struktur erkennen kann liegt eine vorgefertigte Manifest.MF im Projektordner.

wenn eine "jar Datei" erstellt wird, wird ein META-INF Ordner erstellt für eine etwaige Manifest datei, die danach generiert wird.

wenn ich den exclude weg lasse dann wird die vorfertigte Manifest.MF zwar mitkopiert, aber nicht in den META-INF ordner. und ausserhalb des META-INF ordners bringt mir diese Manifest.MF gar nix.

ich hab mehrere sachen versucht das die Manifest.MF nach der Erstellung der jar Datei in den META-INF Ordner rein kopiert wird, aber ohne erfolg. irgendwie auch sinnig, weil wenn die jar Datei generiert wurde kann man sich diese wie einen zip Ordner vorstellen und einfach so etwas dort hinein zu kopieren geht anscheinend nicht.


----------



## knilch (10. Jan 2014)

Hi,
Ok, Du erstellst ein jar, dazu wird ein META-INF Ordner erstellt und das Manifest.mf soll dann in den Ordner META-INF kopiert werden.
Die copy- Direktive 
[XML]
    <copy todir="${release.dir}/">
       <fileset dir="${src.dir}/" includes="**/*.mf"/>
    </copy>
[/XML]
hast du schon probiert?
Wenn die Manifest.mf, die nach dem Erstellen des jar- File generiert wird, auch im selben Ordner abgelegt, wie die Manifest.mf die schon vorhanden ist würde das so aussehen:
(${src.dir} ist der Projektordner/src; ${META-INF} ist Projektordner/META-INF) in diesem Fall liegt Manifest.mf im Verzeichnis: Projektordner/src falls es anders sein soll, muss der Pfad angepasst werden.
[XML]
    <target name="jarbuilder">
    	<jar destfile="maxi66.jar" basedir="bin" excludes="*.html,*.applet, *.jbx, *.MF">
			<manifest>
				<attribute name="Main-Class" value="${main-class}"/>
			</manifest>
    	</jar>
    	<!-- Die neue Maifest.mf sollte hier nun bereit stehen , um sie in META-INF- Ordner zu kopieren-->
		<copy todir="${META-INF}">
			<fileset dir="${src.dir}" includes="*.mf" />
		</copy>
    </target>
[/XML]


----------



## prototype0815 (10. Jan 2014)

*also mein aktueller Code sieht so aus:*
[XML]<?xml version="1.0"?>
<project name="make jar" default="jarbuilder">																<!-- default gibt das "default" target an -->
    <description>
    Kompiliert den aktuellen Stand des Projekts und verpackt ihn in ein .jar-Archiv
    </description>

    <target name="jarbuilder">
        <jar destfile="maxi6.jar" basedir="bin" excludes="*.html,*.applet, *.jbx, *.MF">
        	<manifest>
        		<attribute name="Main-Class" value="mainApplet"/>
        		<attribute name="Trusted-Only" value="true"/>
        		<attribute name="Permissions" value="all-permissions"/>
        		<attribute name="Application-Name" value="Paul Maxi6"/>
        	</manifest>
        </jar>    	
    </target>
</project>[/XML]



*die dadurch generierte jar hab ich entpackt und hier mal einen Screenshot vom META-INF Ordner gemacht: die anderen Dateien einfach ignorieren, ich glaube die sind vom signieren des Applets*







*und hier der Inhalt der generierten Manifest.MF*







*Es funktioniert eigentlich alles ganz annehmbar, nur wäre es schön wenn man die Manifest.MF von Hand ändern könnte, damit man nicht bei jeder Änderung den Sourcecode der build.xml ändern muss. Deshalb will ich die vorhandene Manifest.MF reinkopieren lassen.
Ich hab nun folgenden code versucht:*
[XML]<?xml version="1.0"?>
<project name="make jar" default="jarbuilder">																<!-- default gibt das "default" target an -->
    <description>
    Kompiliert den aktuellen Stand des Projekts und verpackt ihn in ein .jar-Archiv
    </description>

    <target name="jarbuilder">
        <jar destfile="maxi66.jar" basedir="bin" excludes="*.html,*.applet, *.jbx, *.MF">

        </jar>
        <copy todir="${META-INF}/">
           <fileset dir="src" includes="**/*.mf"/>
        </copy>
    </target>
</project>[/XML]


*so sollte die Manifest aussehen:*






*
und so sieht sie tatsächlich aus:*








*die vorhandene Manifest wird also nicht hinein kopiert....was hab ich falsch gemacht ?*


----------



## knilch (10. Jan 2014)

Hi,
Versuch es mal damit:
[XML]    <target name="jarbuilder">
    	<jar destfile="${META-INF}/maxi66.jar" basedir="bin" excludes="*.html, *.applet, *.jbx, *.MF">
    		<manifest>
    			<attribute name="Main-Class" value="mainApplet"/>
    		    <attribute name="Trusted-Only" value="true"/>
    			<attribute name="Permissions" value="all-permissions"/>
    			<attribute name="Application-Name" value="Paul Maxi6"/>
    		</manifest>

    	</jar>
		<copy todir="${META-INF}">
			<fileset dir="${src.dir}" includes="**/*.mf" excludes="**/*.java"/>
		</copy>
    </target>	[/XML]


----------



## prototype0815 (10. Jan 2014)

*hab meinen code um deinen ge-updated*
[XML]<?xml version="1.0"?>
<project name="make jar" default="jarbuilder">																<!-- default gibt das "default" target an -->
    <description>
    Kompiliert den aktuellen Stand des Projekts und verpackt ihn in ein .jar-Archiv
    </description>

    <target name="jarbuilder">
            <jar destfile="${META-INF}/maxi66.jar" basedir="bin" excludes="*.html, *.applet, *.jbx, *.MF">
                <manifest>
                    <attribute name="Main-Class" value="mainApplet"/>
                    <attribute name="Trusted-Only" value="true"/>
                    <attribute name="Permissions" value="all-permissions"/>
                    <attribute name="Application-Name" value="Paul Maxi6"/>
                </manifest>

            </jar>
            <copy todir="${META-INF}">
                <fileset dir="${src.dir}" includes="**/*.mf" excludes="**/*.java"/>
            </copy>
        </target>
</project>[/XML]



*und diese ausgabe bekommen:*


Buildfile: D:\Paul\8306\build.xml

jarbuilder:
         [jar] Building jar: D:\Paul\8306\${META-INF}\maxi66.jar

BUILD FAILED
D:\Paul\8306\build.xml:17: D:\Paul\8306\${src.dir} does not exist.

Total time: 4 seconds



*Hey Knilch, ich will dir hier schon mal ein riesen Dank aussprechen für die Mühe die du dir gibts :toll::applaus:*


----------



## knilch (10. Jan 2014)

> Hey Knilch, ich will dir hier schon mal ein riesen Dank aussprechen für die Mühe die du dir gibts


wenn's hilft, gerne 



> BUILD FAILED
> D:\Paul\8306\build.xml:17: D:\Paul\8306\${src.dir} does not exist.


das heisst, im Build.xml ist kein Property definiert, das src.dir heisst...
versuch es mal so:
[XML]
    <project name="Test" basedir="." default="compile">
    <property name="src.dir" value="src/" /> <!-- hier muss das Verzeichnis stehen, in dem das Manifest.mf abgelegt ist in diesem Beispiel ist es ./src im Projektverzeichnis -->
...
    <target name="jarbuilder">
    	<jar destfile="${META-INF}/maxi66.jar" basedir="bin" excludes="*.html, *.applet, *.jbx, *.MF">
    		<manifest>
    			<attribute name="Main-Class" value="mainApplet"/>
    		    <attribute name="Trusted-Only" value="true"/>
    			<attribute name="Permissions" value="all-permissions"/>
    			<attribute name="Application-Name" value="Paul Maxi6"/>
    		</manifest>

    	</jar>
		<copy todir="${META-INF}">
			<fileset dir="${src.dir}" includes="**/*.mf" excludes="**/*.java"/>
		</copy>
    </target>
   ...
<project/> 
[/XML]


----------



## prototype0815 (10. Jan 2014)

*musste den Sourcecode etwas abändern weil Fehler aufgetaucht sind. Ich hoffe das er trotzdem so passt wie du es wolltest Knilch*
[XML]<?xml version="1.0"?>
    <project name="make_jar" basedir="." default="jarbuilder">
        <property name="src.dir" value="src/" /> <!-- hier muss das Verzeichnis stehen, in dem das Manifest.mf abgelegt ist in diesem Beispiel ist es ./src im Projektverzeichnis -->

        <target name="jarbuilder">
            <jar destfile="${META-INF}/maxi66.jar" basedir="bin" excludes="*.html, *.applet, *.jbx, *.MF">
                <manifest>
                    <attribute name="Main-Class" value="mainApplet"/>
                    <attribute name="Trusted-Only" value="true"/>
                    <attribute name="Permissions" value="all-permissions"/>
                    <attribute name="Application-Name" value="Paul Maxi6666"/>
                </manifest>

            </jar>
            <copy todir="${META-INF}">
                <fileset dir="${src.dir}" includes="**/*.mf" excludes="**/*.java"/>
            </copy>
        </target>

    </project>[/XML]


*also dieser Code macht folgendes: erstellt eine .jar mit generierter (nicht kopierter) Manifest.MF, in einen erstellten Ordner "${META-INF}" in meinem Projekordner "8327".

Sry aber irgendwie komplett anders als ich es will ;( *


----------



## knilch (10. Jan 2014)

Also,
Dieser Teil vom Build.xml:
[XML]
    <target name="jarbuilder">
		<copy todir="bin/META-INF">
			<fileset dir="${src.dir}" includes="**/*.mf" excludes="**/*.java"/>
		</copy>

    	<jar destfile="maxi66.jar" basedir="bin" excludes="*.html, *.applet, *.jbx, *.MF">
    		<manifest>
    			<attribute name="Main-Class" value="mainApplet"/>
    		    <attribute name="Trusted-Only" value="true"/>
    			<attribute name="Permissions" value="all-permissions"/>
    			<attribute name="Application-Name" value="Paul Maxi6"/>
    		</manifest>
    	</jar>
    </target>
[/XML]
kopiert das Maifest.mf in das META-INF- Verzechinis und generiert dann das jar. Wenn nun das jar  (maxi66.jar) geöffnet wird, ist dort ein META-INF- Verzeichnis und in diesem Verzeichnis ist die Datei Manifest.mf mit folgendem Inhalt vorhanden.

```
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.4
Created-By: 1.7.0_25-b17 (Oracle Corporation)
Main-Class: mainApplet
Trusted-Only: true
Permissions: all-permissions
Application-Name: Paul Maxi6
```
ist es das was du möchtest?


----------



## prototype0815 (13. Jan 2014)

knilch hat gesagt.:


> ... *Wenn nun das jar  (maxi66.jar) geöffnet wird, ist dort ein META-INF- Verzeichnis und in diesem Verzeichnis ist die Datei Manifest.mf *...




so, und genau so benötige ich es. Mit meinen Worten: *In der .jar ist ein META-INF Verzeichnis und da hinein soll die Manifest.MF kopiert werden, diese liegt fertig vorhanden im "src" Verzeichnis* ( kann aber auch von mir in den Projekt Ordner gelegt werden, oder sonst irgendwo hin ) der Pfad sieht so aus....
*D:\"Workspace"\"Projektname"\src *


----------

