1

zip ファイルと複数の JAR ファイルのマニフェストを作成する Ant ファイルがあります。zip とマニフェストはどちらも同じライブラリを参照していますが、その方法はわずかに異なります。可能であれば、ファイルへの参照を明示的に2回書き込んで両方のタスクの参照が同期するのではなく、ファイルへの参照を結合したいと考えています。以下は、私が現在行っていることの例です。

<target name="zip" depends="default">
  <zip destfile="${dist.dir}/${project.name}_v${project.version}.zip">
    <zipfileset prefix="lib" dir="lib/Dom4J" includes="*.jar"/>
    <zipfileset prefix="lib" dir="lib/GSON" includes="*.jar"/>
    <zipfileset prefix="lib" dir="lib/Guava" includes="*.jar"/>
    <!-- ... A bunch more (Note I don't want everything 
             in the lib directory, just certain subfolders 
             within the lib directory which are explicitly 
             listed here like GSON. -->
    </zip>
</target>

<target name="createManifest">
   <!-- Hard code the classpath by hand and hope 
        they sync up with the zip task -->
   <property name="mfClasspath" 
             value="dom4j-1.6.1.jar gson-2.1.jar guava-11.0.2.jar" />
   <!-- Code to use the mfClasspath when creating the manifest 
        omitted for brevity -->
</target>

私が理想的に持ちたいのはfileset、両方のタスクで参照できるようなものです。マニフェストにはフォルダー/パスが含まれていないことに注意してください。マニフェストには、タスクで言及されたディレクトリ内にある JAR ファイルのみが含まれzipます。

4

1 に答える 1

1

あなたが正しいです。これは、とタスクfilesetの両方で共有されるコモンで実現できます。このタスクでは、ファイルを一時的な場所にコピーしてから圧縮します。zipcreateManifestzip

このcreateManifestタスクでは、文字置換を使用してパスからフォルダーを削除します。文字置換戦略については、「Ant プロパティで文字を置換する 」で説明しています。Ant-Contribをお持ちの場合は、 PropertyRegex Ant タスクを使用して、以下の文字置換アルゴリズムを簡素化できます。

<project default="all">
    <fileset id="jars" dir=".">
        <include name="lib/Dom4J/dom4j-1.6.1.jar" />
        <include name="lib/GSON/gson-2.1.jar" />
        <include name="lib/Guava/guava-11.0.2.jar" />
    </fileset>

    <target name="zip">
        <copy todir="tmp.dir" flatten="true">
            <fileset refid="jars" />
        </copy>
        <zip destfile="example.zip">
            <zipfileset dir="tmp.dir" prefix="lib" />
        </zip>
        <delete dir="tmp.dir" />
    </target>

    <target name="createManifest">
        <property name="jars.property" refid="jars" />
        <echo message="${jars.property}" file="some.tmp.file" />
        <loadfile property="mfClasspath" srcFile="some.tmp.file">
            <filterchain>
                <tokenfilter>
                    <replaceregex pattern="(?:[^;/]+/)+?([^;/]+\.jar)"
                        replace="\1" flags="g" />
                    <replacestring from=";" to=" " />
                </tokenfilter>
            </filterchain>
        </loadfile>
        <delete file="some.tmp.file" />
    </target>

    <target name="all" depends="zip, createManifest">
        <echo message="$${jars.property} = &quot;${jars.property}&quot;" />
        <echo message="$${mfClasspath} = &quot;${mfClasspath}&quot;" />
    </target>
</project>

上記の Ant ビルドファイルを実行すると、コンソールに次のように出力されました。

Buildfile: /workspace/StackOverflow/build.xml
zip:
      [zip] Building zip: /workspace/StackOverflow/example.zip
   [delete] Deleting directory /workspace/StackOverflow/tmp.dir
createManifest:
   [delete] Deleting: /workspace/StackOverflow/some.tmp.file
all:
     [echo] ${jars.property} = "lib/Dom4J/dom4j-1.6.1.jar;lib/GSON/gson-2.1.jar;lib/Guava/guava-11.0.2.jar"
     [echo] ${mfClasspath} = "dom4j-1.6.1.jar gson-2.1.jar guava-11.0.2.jar"
BUILD SUCCESSFUL
Total time: 675 milliseconds

また、example.zipには次のエントリが含まれていました。

  • lib/dom4j-1.6.1.jar
  • lib/gson-2.1.jar
  • lib/グアバ-11.0.2.jar
于 2012-05-04T01:56:30.200 に答える