相关疑难解决方法(0)

如何编译和jar字节相同的jar文件,即MD5匹配除非.java(以及.class)更改?

摘要

如何让ant从相同的.class文件中重复生成与字节相同的jar文件?

背景

我们的构建过程执行以下操作:

  1. 从另一个应用程序的源存储库获取web-services-definition(wsdl)文件
  2. 运行wsdl2java生成.java文件供Web服务客户端使用(即我们的应用程序)
  3. 编译java文件
  4. 从编译器输出生成.jar文件
  5. 检查'artifact'jar文件到源代码管理中

注意:我们执行了最后一步,因此开发人员可以访问此jar文件,而无需自行构建.我们使用一个特殊的'derived'目录来区分源和工件.

问题

即使源文件没有改变,我们也无法获得生成字节相同的.jar文件的蚂蚁,即每个构建生成一个略有不同的jar(具有不同的MD5)

我检查了互联网,并在5年前找到了这个问题:

如果我使用ANT编译一些代码并创建一个jar和相关的md5文件,那么即使代码没有改变,md5文件中的校验和也是不同的.任何想法都是为什么它如此规避?我怀疑某处有一些时间戳信息.

http://www.velocityreviews.com/forums/t150783-creating-new-jar-same-code-different-md5.html

根据回复,我尝试了以下方法:

  1. 在震动之前,在所有.class文件上将时间戳设置为"0"
  2. 指定清单文件,并将此清单的时间戳设置为0

[注意:第二步似乎无效.见下文]

每次构建之后,.jar文件仍然具有不同的MD5总和.

CSI:Jar文件

我没有进行过检查和检查,并且罐子的内容和时间戳在"不同"的罐子之间匹配,但有一个例外:META-INF/MANIFEST.MF的不同时间戳.

   <-- touch classes and manifest to set consistent timestamp across builds -->
   <touch millis="0">
    <fileset dir="${mycompany.ws.classes.dir}"/>
   </touch>
   <touch millis="0" file="mymanifest.mf"/>

   <jar destfile="${derived.lib.dir}/mycompanyws.jar"
        manifest="mymanifest.mf"
        basedir="${mycompany.ws.classes.dir}"
        includes="**/com/mycompany/**,**/org/apache/xml/**" 
    />
Run Code Online (Sandbox Code Playgroud)

其他选择

如果.java文件已经更改,我们可以使用更高级的ant编程来检查.jar文件.

java ant jar

12
推荐指数
2
解决办法
3906
查看次数

标签 统计

ant ×1

jar ×1

java ×1