1

我需要在我的文件夹中解压缩多个 jar 并在 Manifest.MF 中添加一些条目,并且必须再次单独压缩 jar。我不需要组合罐。但我需要带有新清单条目的个人罐子。我如何使用 ant 脚本来做到这一点?有没有办法做到这一点。

例如。我的位置有两个 jar 文件,比如 test1.jar、test2.jar

所以如果我用这段代码解压

<jar destfile="test1.jar">
    <fileset dir="build/main/classes"/>
    <zipfileset includes="**/*.class" src="lib/main/test.jar"/>
    <manifest>
    <attribute name="permission" value="all-permissions"/>
    </manifest>
</jar>

如果我要压缩它

<zip destfile="test1.jar">
 <zipfileset src="test.jar">
  <exclude name="do/not/include/this/class"/>
 </zipfileset>
</zip>

在这种情况下,对于 test2.jar 的处理,我必须在我的 build.xml 中再次重复上述脚本

但我需要通用地执行此操作,以便它可以获取我的两个 jar 文件并添加清单属性并创建两个与 test1.jar 和 test2.jar 同名的 jar。

就像是:

 <jar destfile="*.jar">
    <fileset dir="build/main/classes"/>
    <zipfileset includes="**/*.class" src="lib/main/test.jar"/>
    <manifest>
    <attribute name="permission" value="all-permissions"/>
    </manifest>
</jar>
4

3 回答 3

1

听起来你可以用宏来做到这一点:

<macrodef name="updatemanifest">
    <attribute name="jarfile"/>
    <sequential>
        <local name="manifest"/>
        <tempfile property="manifest" destdir="${java.io.tmpdir}"
            suffix=".mf"/>

        <copy tofile=${manifest}">
            <zipentry zipfile="@{jarfile}" name="META-INF/MANIFEST.MF"/>
        </copy>

        <manifest file="${manifest}" mode="update">
            <attribute name="permission" value="all-permissions"/>
        </manifest>

        <jar destfile="@{jarfile}" manifest="${manifest}" update="true"/>

        <delete file="${manifest}"/>
    </sequential>
</macrodef>

<updatemanifest jarfile="build/test1.jar"/>
<updatemanifest jarfile="build/test2.jar"/>
于 2013-10-25T23:30:45.207 回答
0

您可以使用AntCall 任务foreach,但您必须使用 ant-contrib:

<target name="myMaintask">
  <foreach target="UnzipChangeZip" param="fileName">
    <fileset dir="${myDirectoryWithJars}" casesensitive="yes">
      <include name="**/*.jar"/>
    </fileset>
  </foreach>
</target>

<target name="UnzipChangeZip">
  <echo message="fileName=${fileName}"/>

  <jar destfile="${fileName}">
    <fileset dir="build/main/classes"/>
    <zipfileset includes="**/*.class" src="lib/main/test.jar"/>
    <manifest>
    <attribute name="permission" value="all-permissions"/>
    </manifest>
 </jar>

 <zip destfile="${fileName}">
   <zipfileset src="test.jar">
     <exclude name="do/not/include/this/class"/>
   </zipfileset>
 </zip>

</target>
于 2013-10-25T07:12:36.097 回答
0

只需使用 ant 的Jar 任务

例子:

<jar destfile="build/main/checksites.jar">
    <fileset dir="build/main/classes"/>
    <zipfileset includes="**/*.class" src="lib/main/some.jar"/>
    <manifest>
      <attribute name="Main-Class" value="com.acme.checksites.Main"/>
    </manifest>
</jar>

对于解压缩,您可以使用 ant 的解压缩任务

例子:

<zip destfile="new.jar">
  <zipfileset src="old.jar">
    <exclude name="do/not/include/this/class"/>
  </zipfileset>
</zip>
于 2013-10-25T06:17:42.403 回答