2009-05-30 3 views
0

Meiner aktuellen Build-Datei hat folgende wiederholende Aufgaben erzeugen:Dynamisch JAR-Dateien basierend auf Paketnamen mit ANT

<jar jarfile="${build.lib}/${prefix}-foo.jar"> 
    <fileset dir="${build.classes}"> 
     <include name="com/a/c/foo/**"/> 
    </fileset> 
</jar> 
<jar jarfile="${build.lib}/${prefix}-bar.jar"> 
    <fileset dir="${build.classes}"> 
     <include name="com/a/c/bar/**"/> 
    </fileset> 
</jar> 

... etc. Das Problem ist, dass die build.xml muss für jedes neues Paket geändert werden oder für jedes neue Unterprojekt. Dies ist ein häufiges Vorkommnis, wo ich arbeite.

Ich möchte dies durch Logik ersetzen, die dynamisch die JARs und ihre Dateinamen basierend auf einem "root" -Paket generiert. So könnte ich zum Beispiel das root-Paket als com/a/c festlegen, und alle Pakete direkt unter diesem Paket erhalten ihre eigene JAR. Beachten Sie, dass alle Pakete unter "foo" oder "bar" nur Teil von "foo.jar" oder "bar.jar" sind.

Ich suchte nach Schleifenlogikaufgaben für ANT. Ich habe einen in jedem ant-contrib und JWare/AntXtras gefunden, aber ich konnte nicht wie gewünscht arbeiten.

+0

Dies scheint wie eine Art ungerade Anforderung. Kannst du genauer erklären, warum ein einzelnes Glas nicht für deine Zwecke geeignet ist? – Jherico

+0

Ich stimme zu, es ist definitiv aus dem linken Bereich. Wir haben ein "Basisglas" für alle gängigen Apis. Von dort aus könnte jede JAR in einer anderen Linux-Umgebung mit dem Basis-Jar platziert werden. Außerdem möchten die meisten unserer Kunden nur ein oder zwei Gläser ersetzen, die ein kleines Stück der Anwendung enthalten, anstatt alles zu ersetzen. –

Antwort

4

Ich weiß nicht über Schleifen und finden Sie alle Paketnamen, aber Sie könnten ein Makro verwenden, um Code-Duplizierung zu vermeiden.

Ich habe nicht versucht, aber es könnte

<macrodef name="build_jar"> 
    <attribute name="name"/> 
    <sequential> 
     <jar jarfile="${build.lib}/${prefix}[email protected]{name}.jar"> 
      <fileset dir="${build.classes}"> 
       <include name="com/a/c/@{name}/**"/> 
      </fileset> 
     </jar> 
    </sequential 
</macrodef> 

<target name="build_foo"> 
    <build_jar name="foo"/> 
</target> 

<target name="build_bar"> 
    <build_jar name="bar"/> 
</target> 
1

Wie wäre diese Arbeit:

<project name="dynjar" default="jar" basedir="."> 
    <property name="build.classes" value="${basedir}/classes"/> 
    <property name="build.lib" value="${basedir}/lib"/> 
    <property name="prefix" value="prefix"/> 
    <property name="root" value="com/a/c"/> 

    <target name="jar"> 
     <!-- ${ant.file} is the name of the current build file --> 
     <subant genericantfile="${ant.file}" target="do-jar"> 

      <!-- Pass the needed properties to the subant call. You could also use 
       the inheritall attribute on the subant element above to pass all 
       properties. --> 
      <propertyset> 
       <propertyref name="build.classes"/> 
       <propertyref name="build.lib"/> 
       <propertyref name="prefix"/> 
       <propertyref name="root"/> 
      </propertyset> 

      <!-- subant will call the "do-jar" target for every directory in the 
       ${build.classes}/${root} directory, making the subdirectory the 
       basedir. --> 
      <dirset dir="${build.classes}/${root}" includes="*"/> 
     </subant> 
    </target> 

    <target name="do-jar"> 
     <!-- Get the basename of the basedir (foo, bar, etc.) --> 
     <basename file="${basedir}" property="suffix"/> 

     <jar jarfile="${build.lib}/${prefix}-${suffix}.jar"> 
      <fileset dir="${build.classes}"> 
       <include name="${root}/${suffix}/**"/> 
      </fileset> 
     </jar> 
    </target> 
</project> 
+0

Ich benutze dies für die Herstellung meiner Gläser, aber ich habe ein Problem. Kannst du mir helfen [hier] (http://stackoverflow.com/questions/23075813/adding-packages-to-jars)? –

Verwandte Themen