2016-04-01 2 views
1

Ich habe eine build.xml, wo ich etwas Fett runnable Gläser mit Zielen zusammen mit vergleichbar:Weiternutzung Liste der zipfileset Aussagen in ANT

<target name="create_myapp_jar"> 
    <jar destfile="./production/myapp.jar" filesetmanifest="mergewithoutmain"> 
    <manifest> 
     <attribute name="Main-Class" value="com.something.entrypoints.MyApp"/> 
     <attribute name="Class-Path" value="."/> 
    </manifest> 
    <fileset dir="./classes"/> 
    <zipfileset excludes="META-INF/*.SF" src="./lib/commons-cli-1.2.jar"/> 
    <zipfileset excludes="META-INF/*.SF" src="./lib/commons-codec-1.10-sources.jar"/> 
    <zipfileset excludes="META-INF/*.SF" src="./lib/commons-codec-1.10.jar"/> 
    <zipfileset excludes="META-INF/*.SF" src="./lib/commons-io-2.4.jar"/> 
    <zipfileset excludes="META-INF/*.SF" src="./lib/commons-lang-2.6.jar"/> 
    <zipfileset excludes="META-INF/*.SF" src="./lib/commons-pool2-2.2.jar"/> 

    lots and lots of more JARs here.... 
</target> 

Der Code wurde von Eclipse-(Export runnable Jar) erzeugt und mit geringfügigem Änderungen von mir.

Die Liste der enthaltenen Jars ist eigentlich ziemlich lang. Ich habe mehrere dieser Fetdosen gebaut, und ich fragte mich, wie ich es vermeiden konnte, die <zipfileset> Aussagen für jedes Ziel aufzulisten?

Wie kann ich sie alle zusammen schlagen und dann von jedem Fat-Jar Build-Ziel referenzieren? Alles in dem Sinn, meine build.xml nicht zu Hunderten und Aberhunderten von Zeilen anschwellen zu lassen. Auch der Schmerz, ein neues JAR zu jedem der Ziele hinzuzufügen, würde verschwinden, wenn ich irgendwo eine Definition hätte.

Antwort

1

Soweit ich verstehe, ist Ihre ZIPfileset Einträge Liste immer für jedes gebaute Gläser? Vielleicht sollten Sie in Erwägung ziehen, einen Makro zu erstellen, der die Einträge in zipfileset enthält, und das Makro für den Kontext jedes Ziels mit Variablen anzupassen:

<macrodef name="make-jar"> 
    <attribute name="destfile"/> 
    <attribute name="mainclass"/> 
    <attribute name="classpath"/> 
    <attribute name="obj.dir"/> 
    <sequential> 
     <jar destfile="@{destfile}" filesetmanifest="mergewithoutmain"> 
      <manifest> 
       <attribute name="Main-Class" value="@{mainclass}"/> 
       <attribute name="Class-Path" value="@{classpath}"/> 
      </manifest> 
      <fileset dir="@{obj.dir}"/> 
      <zipfileset excludes="META-INF/*.SF" src="./lib/commons-cli-1.2.jar"/> 
      <zipfileset excludes="META-INF/*.SF" src="./lib/commons-codec-1.10-sources.jar"/> 
      <zipfileset excludes="META-INF/*.SF" src="./lib/commons-codec-1.10.jar"/> 
      <zipfileset excludes="META-INF/*.SF" src="./lib/commons-io-2.4.jar"/> 
      <zipfileset excludes="META-INF/*.SF" src="./lib/commons-lang-2.6.jar"/> 
      <zipfileset excludes="META-INF/*.SF" src="./lib/commons-pool2-2.2.jar"/> 

      lots and lots of more JARs here.... 
     </jar> 
    </sequential> 
</macrodef> 

<target name="create_myapp_jar"> 
    <make-jar destfile="./production/myapp.jar" mainclass="com.something.entrypoints.MyApp" classpath="." obj.dir="./classes"/> 
</target> 
+0

Das hat wunderbar funktioniert, und ich habe auch etwas für Makros ... Schade, dass ich nicht beide Antworten als "richtig" markieren kann. Denke darüber nach, welcher der Beste ist. –

1

A zipgroupfileset kann dies verwendet werden, um zu erreichen:

<target name="create_myapp_jar"> 
    <jar destfile="./production/myapp.jar" filesetmanifest="mergewithoutmain"> 
     <manifest> 
      <attribute name="Main-Class" value="com.something.entrypoints.MyApp"/> 
      <attribute name="Class-Path" value="."/> 
     </manifest> 
     <fileset dir="./classes"/> 
     <zipgroupfileset dir="lib/" includes="*.jar" excludes="META-INF/*.SF" /> 
    </jar> 
</target> 

Wenn Sie das Jar fileset für eine spätere Wiederverwendung speichern müssen, die Sie tun können:

<fileset dir="lib" id="lib_jars"> 
    <include name="*.jar"/> 
</fileset> 
<jar destfile="./production/myapp.jar" filesetmanifest="mergewithoutmain"> 
    <manifest> 
     <attribute name="Main-Class" value="com.something.entrypoints.MyApp"/> 
     <attribute name="Class-Path" value="."/> 
    </manifest> 
    <fileset dir="./classes"/> 
    <zipgroupfileset refid="lib_jars" /> 
</jar> 

EDIT:

Es scheint, dass die excludes nur Dateien im dir Verzeichnis ausschließt, nicht Einträge von th e Jar Dateien selbst, wie in Ant: Exclude files from merged jar file erläutert. Es gibt eine Antwort, die eine einfache Problemumgehung bietet.

+0

Vielen Dank! Das löst mein unmittelbares Problem, das funktioniert aber nur, wenn sich die Jars im selben Verzeichnis befinden (was natürlich die am häufigsten vorkommende Situation ist). Wenn ich es wollen würde, könnte ich dann irgendwie eine Liste von Gläsern "gruppieren", ihnen einen Namen geben und dann stattdessen den Namen referenzieren? –

+0

Beim Ausführen habe ich die "Ausnahme im Thread" main "java.lang.SecurityException: Ungültige Signaturdatei Digest für Manifest Hauptattribute", funktioniert das Ausschließen wirklich? –

+0

@PeterAndersson Sie haben Recht. Das 'excludes' funktioniert hier nicht wie erwartet für' zipgroupfileset'. Ich habe die Antwort aktualisiert. – manouti