【问题标题】:zipping and unzipping using ant script while adding some property在添加一些属性时使用 ant 脚本进行压缩和解压缩
【发布时间】:2013-10-26 07:30:45
【问题描述】:

我需要在我的文件夹中解压缩多个 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>

【问题讨论】:

    标签: java maven ant


    【解决方案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"/>
    

    【讨论】:

      【解决方案2】:

      只需使用 ant 的Jar task

      例子:

      <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的unzip task

      例子:

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

      【讨论】:

      • 是的,这是正确的。但在这种情况下,我对 jar 文件名进行了硬编码。但是我有可能做到通用吗?这样我就可以解压缩所有文件,添加属性,然后以相同的名称再次对其进行 jar,而无需提及实际的 jar 名称。 .
      • 你可以循环特定文件并在它们上执行任务。示例stackoverflow.com/q/1467991/1183010
      • 我认为你误解了我的问题。我再次编辑了我的问题。我不确定您的解决方案是否适用。
      【解决方案3】:

      你可以使用AntCall taskforeach,但是你必须使用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>
      

      【讨论】:

      • 这很有帮助。但是您再次将代码中的 jar 文件硬编码为 test1 和 test2.jar。但我在文件夹中有数百个 jar 文件,我不想手动设置所有名称..
      猜你喜欢
      • 1970-01-01
      • 2011-07-22
      • 2012-05-22
      • 2011-03-13
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多