【问题标题】:Reusing list of zipfileset statements in ANT在 ANT 中重用 zipfileset 语句列表
【发布时间】:2016-07-21 01:45:34
【问题描述】:

我有一个 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) 生成,并由我稍作改动。

包含的罐子列表实际上很长。我构建了几个这样的 fat-jars,我想知道如何避免列出每个目标的 &lt;zipfileset&gt; 语句?

如何将它们全部组合在一起,然后从每个 fat-jar 构建目标中引用它们?一切都是为了不让我的 build.xml 膨胀到成百上千行。如果我可以在某个地方有一个定义,那么向每个目标添加新 JAR 的痛苦也会消失。

【问题讨论】:

    标签: eclipse ant jar build


    【解决方案1】:

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

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

    【讨论】:

    • 这很好用,而且我碰巧也有宏的东西....很遗憾,我不能将两个答案都标记为“正确”。必须考虑哪个是最好的。
    【解决方案2】:

    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 文件集以供以后重用,您可以这样做:

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

    编辑:

    excludes 似乎只排除了 dir 目录中的文件,而不是 Jar 文件本身的条目,如 Ant: Exclude files from merged jar file 中所述。那里有一个提供简单解决方法的答案。

    【讨论】:

    • 谢谢!这解决了我的直接问题,但是这仅在 jar 位于同一目录中时才有效(当然这是最常见的情况)。如果我想要它,我是否可以“分组”一个 jar 列表,给它们一个名称,然后引用该名称?
    • 运行时出现“异常在线程“main”java.lang.SecurityException: Invalid signature file digest for Manifest main attributes”,排除真的有效吗?
    • @PeterAndersson 你是对的。对于zipgroupfilesetexcludes 在此处无法正常工作。我更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多