Mehrere externe JARs in eine JAR einbinden

Das Einbinden von externen JAR-Bibliotheken in der eigenen JAR ist mit einem Apache Ant Build-Task recht einfach. Für mein Beispiel verweise ich auf dieses [post id=2583]Ant Build Skript[/post]. Mit nur einer weiteren Zeile (Zeile Nummer 6) kann man die build.xml so erweitern, dass alle externen Bibliotheken aus dem /lib-Verzeichnis in die eigene JAR gepackt werden:

1
2
3
4
5
6
7
<jar destfile="${jar.dir}/${ant.project.name}-${app.version}.jar" basedir="${classes.dir}">
	<manifest>
		<attribute name="Main-Class" value="${main.class}" />
		<attribute name="Class-Path" value="${manifest.class.path}" />
	</manifest>
	<zipgroupfileset dir="${lib.dir}/."/>
</jar>

Das zipgroupfileset unterstützt alle Attribute des <fileset>, wodurch über folgenden Befehl einzelne Dateien ausgeschlossen werden können:

1
<zipgroupfileset dir="${lib.dir}/." excludes="junit-4.8.2.jar" />

Für weitere Infos verweise ich auf den Beitrag „NetBeans – deploying all in one jar“ von stackoverflow.

Beispiel für Apache Ant Build Script

In letzter Zeit habe ich viel mit Apache Ant Build-Skripten zu tun. Bei richtiger Konfigurationen bringt Apache Ant einen erheblichen Vorteil bei der Erstellung von Java-Projekten, unabhängig von Betriebssystem und IDE. Um Anfängern den Einstieg in Ant zu erleichtern, habe ich eine Vorlage für eine build.xml mitsamt build.properties erstellt, die beliebig erweitert werden kann.

In NetBeans kann man mit einem Java Free-Form Project das eigene Build-Skript benutzen.
Beispiel für Apache Ant Build Script weiterlesen

Ant – includeantruntime was not set

Wenn Apache Ant diese Meldung bringt:

warning: ‚includeantruntime‘ was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds

Dann muss man im Build-Script (build.xml) die includeantruntime setzen.
Es folgt ein exemplarisches Beispiel.

Fehlerhafte Zeile:

<javac srcdir="${src.dir}" destdir="${classes.dir}"/>

Korrigierte Zeile:

<javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="false"/>