Google使用bsdiff和Courgette修补Chrome分发等二进制文件。是否存在用于修补jar文件的类似工具?
我正在通过带宽有限的连接远程更新jar文件,并希望最大限度地减少发送的数据量。我在某种程度上对客户端机器有一些控制权(即我可以在本地运行脚本),并且我保证目标应用程序当时不会运行。
我知道我可以通过在类路径中放入更新的类文件来修补java应用程序,但我更喜欢使用更简洁的方法来进行更新。如果我可以从目标jar文件开始,应用二进制补丁,然后使用与新jar(从中创建补丁)相同(按位)的更新jar文件,这将是一件好事。
答案 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)
它是为二进制差异和修补目录构建的,您可以使用IOFilter
来过滤包含的文件