Eclipse 在ANT中重用zipfileset语句列表

Eclipse 在ANT中重用zipfileset语句列表,eclipse,ant,jar,build,Eclipse,Ant,Jar,Build,我有一个build.xml,其中我将一些胖的可运行jar放在一起,目标类似于: <target name="create_myapp_jar"> <jar destfile="./production/myapp.jar" filesetmanifest="mergewithoutmain"> <manifest> <attribute name="Main-Class" value="com.something.entrypoi

我有一个build.xml,其中我将一些胖的可运行jar放在一起,目标类似于:

<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>

这里有很多很多罐子。。。。
代码是由Eclipse(Export runnable Jar)生成的,我做了一些小改动

所包括的罐子的列表实际上相当长。我构建了几个这样的胖罐子,我想知道如何避免为每个目标列出
语句


我如何将它们组合在一起,然后从每个胖jar构建目标引用它们?所有这些都是为了不让build.xml膨胀到成百上千行。另外,如果我能在某个地方有一个定义,那么向每个目标添加一个新JAR的痛苦就会消失。

a
zipgroupfileset
可以用来完成这一点:

<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>


. 这里有一个简单的解决方法。

据我所知,每个构建的jar的zipfileset条目列表总是相同的?也许你应该考虑制作一个包含ZIPFILSEET条目的宏,并使用变量来调整每个目标上下文的宏:

<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>

这里有很多很多罐子。。。。

谢谢!这就解决了我眼前的问题,但是这只适用于JAR位于同一目录中的情况(当然这是最常见的情况)。如果我想要它,我是否可以“分组”一个JAR列表,给它们一个名称,然后引用该名称?运行时,我得到了“线程中的异常”main“java.lang.SecurityException:清单主属性的签名文件摘要无效”,排除真的有效吗?@peternderson你说得对。对于
zipgroupfileset
,此处的
excludes
无法按预期工作。我更新了答案。这很好地工作了,我碰巧也有一个宏的东西。。。。可惜我不能把两个答案都标为“正确”。必须考虑哪一个是最好的。
<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>