java - pack200 的解压缩在所有平台上是否具有确定性和相同性?

标签 java

我想将我的 20-jar 应用程序作为 pack200 文件分发,但我还需要提供文件校验和以进行验证。

因为我很偏执(谢谢你,JWS),我也想对解压缩的文件进行校验和。

pack200 的解压是否具有确定性并在所有平台(Win/Mac/Linux 跨 32/64 位)上给出相同的结果?

换句话说,我可以在一台计算机上解压缩文件,计算它们的校验和,并期望它们在其他计算机上解压缩时始终相同吗?

编辑:感谢您的评论。我正在寻找一些硬规范来确认或否认这一点。

做出假设(即使基于对几台机器的测试)意味着风险。

实现可能因平台和 Java 版本而异。即使是相同的实现也会产生不同的结果(想想 ZIP 目录中项目的顺序?)。这就是为什么我问它是否对所有平台和 Java 版本都相同 AND 确定性


如果不能证实或否认这一点,那么这个后续问题呢?解压后如何验证jar是否有效?想想半成品文件、 Gamma 射线破坏文件中的单个位等等。

最佳答案

思考that's你在找什么。

...However, for any given Pack200 archive, every decompressor is required to produce a particular byte-wise image for each class file transmitted. This requirement is placed on decompressors in order to make it possible for compressors to transmit information, such as message digests, which relates to the eventual byte-wise contents of transmitted class files. This section describes the restrictions placed on every decompressor that makes the byte-wise contents of its output files a well-defined function of its input.

这意味着您可以在这里做您想做的事。 JNF/Pack200 的工作原理是去除跨类共享的常量并智能地压缩 .class 文件——但这部分标准表示虽然可以通过多种方式重建类文件,但这将导致无法验证这些带有摘要的文件。为了避免这个问题,Pack200 明确指定了解码应该如何工作——因此虽然输出的 .class 文件可能与输入的 .class 文件不同,但每个 Pack200 解压器输出的 .class 文件都将匹配所有其他 Pack200 解压器的输出 .class 文件。

所以最好的办法是用 Pack200 打包它们,解压它们,然后执行 MD5 或类似的摘要算法,并使用它来验证解压后的文件。

希望这能回答您的问题!

关于java - pack200 的解压缩在所有平台上是否具有确定性和相同性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6151698/

相关文章:

java - 如何显示部署在 Tomcat 中的应用程序的维护页面?

java - 在java中向渐变面板添加颜色?

java - Websphere wsadmin 读取 csv

java - ReentrantLock 公平性参数

java - 从 Java HashMap 获取 Integer 值时是否需要调用 intValue() 方法?

java - 需要 bean 的 JSONObject 构造函数不会映射父类(super class)中的属性

java - 按自定义顺序对 RealmResult 进行排序

java - 从 maven RESTEasy webapp 在 tomcat 中显示 html 页面

java - Arrays.sort(Object[] a) - 它是如何实现的?

java - 是否可以使用 Citrus-Framework 获取字符串形式的 http 响应的内容类型?