<script type="text/javascript">
</script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>
新的网址:https://sites.google.com/site/llmfei/resignjar
应用场景 : web应用是基于Applet的,由于要访问本地文件,所以必须经过签名才有权限。过了好长一段时间,签名失效了,因此要对这些jar重新进行签名。 实现:
Ant Script to Resign JAR : build.xml <project name="signjars" default="sign" basedir="."> <description> sign jar files </description> <!-- --为了能够识别后面用到的for task, --必须下载
ant-contrib-0.6.jar并把它放在ant installed directory的lib目录下面
,然后添加以下两个taskdef节点。 --否则,运行的时候会报找不到for task。具体参看后面的“参考” --> <!--指定for task所在的定义文件,这个直接照抄就是了--> <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
<!--指定for task所实现的类的位置,指向ant installed directory的lib目录,需要根据你的实际安装目录修改location-->
<taskdef resource="net/sf/antcontrib/antcontrib.properties"> <classpath> <pathelement location="../apache-ant-1.6.1/lib/ant-contrib-0.6.jar"/> </classpath> </taskdef>
<!--该文件夹下面存放了要重新签名的jar包-->
<property name="resignDir" value="resignDir"></property>
<!--定义unsignjar task-->
<macrodef name="unsignjar">
<!--参数jar,代表一个jar文件-->
<attribute name="jar"/> <sequential> <!-- Remove any existing signatures from a JAR file. --> <tempfile prefix="usignjar-" destdir="${java.io.tmpdir}" property="temp.file"/> <echo message="Removing signatures from JAR: @{jar}"/> <mkdir dir="${temp.file}"/> <unjar src="@{jar}" dest="${temp.file}"> <patternset> <include name="**"/> <exclude name="META-INF/*.SF"/> <exclude name="META-INF/*.DSA"/> <exclude name="META-INF/*.RSA"/> </patternset> </unjar> <delete file="@{jar}" failonerror="true"/> <!-- Touch it in case the file didn't have a manifest. Otherwise the JAR task below will fail if the manifest file doesn't exist. --> <mkdir dir="${temp.file}/META-INF"/> <touch file="${temp.file}/META-INF/MANIFEST.MF"/> <jar destfile="@{jar}" basedir="${temp.file}" includes="**" manifest="${temp.file}/META-INF/MANIFEST.MF"/> <delete dir="${temp.file}" failonerror="true"/> </sequential> </macrodef>
<!--target resign, ant -f build.xml resign,重新签名的文件会覆盖 原始文件,注意备份 原始文件 -->
<target name="resign"> <for param="file">
<!--内嵌path元素用于列出所有jar包,循环过程中每个jar文件赋值给变量file-->
<path> <fileset dir="${resignDir}" includes="**/*.jar"/> </path> <sequential>
<!--antcall unsignjar会出错,原因不明,直接调用task unsignjar是可以的-->
<!-- <antcall target="unsignjar"> <param name="jar" value="@{file}"/> </antcall> --> <unsignjar jar="@{file}"/>
<!--signjar的参数需要根据你的实际情况修改,当然你需要有签名用的那些文件了-->
<signjar jar="@{file}" alias="${signjar.alias}" storetype="${signjar.storetype}" storepass="${signjar.storepass}" keystore="${signjar.keystore}"/> </sequential> </for> </target> </project>
参考:
基本上这个ant script都是参考这篇文章的。我仅仅是指出了实际运行中我遇到的问题。
下载ant-contrib-0.6.jar及其
使用说明
<script type="text/javascript">
</script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>