是否有类似bsdiff / Courgette的jar文件?

时间:2010-03-30 15:46:29

标签: java jar distribution patch

Google使用bsdiffCourgette修补Chrome分发等二进制文件。是否存在用于修补jar文件的类似工具?

我正在通过带宽有限的连接远程更新jar文件,并希望最大限度地减少发送的数据量。我在某种程度上对客户端机器有一些控制权(即我可以在本地运行脚本),并且我保证目标应用程序当时不会运行。

我知道我可以通过在类路径中放入更新的类文件来修补java应用程序,但我更喜欢使用更简洁的方法来进行更新。如果我可以从目标jar文件开始,应用二进制补丁,然后使用与新jar(从中创建补丁)相同(按位)的更新jar文件,这将是一件好事。

4 个答案:

答案 0 :(得分:2)

在Sourceforge上尝试javaxdelta项目。它应该允许创建补丁并应用它们。

[编辑]此工具尚不存在。使用常用工具打开JAR文件,然后使用javaxdelta在JAR中为每个条目创建一个补丁。将它们压缩并将它们复制到服务器上。

另一方面,您需要安装一个小的可执行JAR,它将补丁和JAR文件作为参数并应用补丁。你也必须写这个,但这不应该花费几个小时。

答案 1 :(得分:1)

.jar文件已经被压缩了,所以你真正需要的是一个压缩文件,它可以很好地处理zip文件;)。如果你在之前将它填入jar中,你就有更好的机会利用我所期望的“java”的知识。我怀疑你可以调整这个paper中描述的分解作为java特定的压缩方法。

答案 2 :(得分:1)

问题是源中的非常小的更改可能会在压缩的.JAR文件中发生很大的变化。

这是删除冗余的工件。所以无论你的差异工具有多好,它都有一项几乎不可能完成的任务。

然而 - 有一个解决方案,即生成差异并将补丁应用于未压缩的数据。例如:

说你有

项目v1.jar

项目v2.jar

生成这两个文件之间的差异可能很大,即使内部变化可能非常小。所以说我们有一个'unjar'和'rejar'程序 - 我们可以生成

project-v1.jar - >项目v1.jar.unjar

project-v2.jar - >项目v2.jar.unjar

然后,在'unjar'文件之间进行差异以生成补丁。要应用补丁

project-v1.jar(unjar) - > project-v1.jar.unjar - (应用补丁) - > project-v1.patched.unjar(rejar) - >项目v1.patched.jar

实际上,'unjar'(和'rejar'是相反的)程序应该采用源ZIP文件(或任何其他类型的文件),并解压缩内容 - 包括标题,属性和任何其他细节到输出流(而不是创建单个文件)。

这不应该是一个非常复杂的过滤器。额外的奖励是使其具有压缩感知和递归(因此您可以将其应用于WAR文件)。

答案 3 :(得分:0)

检查delta-updater

它是为二进制差异和修补目录构建的,您可以使用IOFilter来过滤包含的文件