代码之家  ›  专栏  ›  技术社区  ›  Jeff Storey

Java软件补丁

  •  5
  • Jeff Storey  · 技术社区  · 14 年前

    我正在尝试创建一个进程来修补当前的Java应用程序,因此用户只需要下载差异而不是整个应用程序。我不认为我需要像二进制diff那样低级别,因为大多数jar文件都很小,所以替换整个jar文件就没什么大不了的了(最多可能是5MB)。

    是否有标准工具来确定哪些文件已更改并为其生成修补程序?我见过xdelta和vpatch这样的工具,但我认为它们是二进制的。

    我基本上想知道-哪些文件需要添加、替换或删除。当我运行补丁时,它将检查软件的当前版本(从注册表设置),并确保补丁的版本正确。如果是,它将进行必要的更改。这听起来并不太难单独实现,但我想知道是否其他人已经这样做了。如果有什么区别的话,我用NSI作为安装程序。

    谢谢,

    杰夫

    4 回复  |  直到 14 年前
        1
  •  6
  •   Bill K    14 年前

    做这个的时候要小心——我建议你不要做。

    最大的问题是公共静态变量。它们实际上被编译到目标中,而不是被引用。这意味着,即使Java文件没有改变,类必须重新编译,或者仍然引用旧的值。

    您还需要非常小心地更改方法签名——如果您更改方法签名,并且不重新编译调用该方法的所有文件,即使调用的Java文件实际上不需要更改(例如,将参数从int更改为L),也会得到一些非常微妙的错误。东)

    如果你决定沿着这条路走下去,那么就要准备好在客户网站上出现一些非常难以调试的错误(通常没有痕迹或明显的迹象,只是收到的数字与发送的数字不匹配等奇怪的行为),而这些错误是你无法复制的,并且会让很多客户恼火。

    编辑(注释太长):

    类文件的二进制差异可能会起作用,但我假设编译了某种版本号或日期,并且它们会无缘无故地改变每个编译,但这很容易测试。

    您可以采取一些不使用的严格的开发实践 公众的 最终的静态(使它们成为私有的)和不是所有更改的方法签名(相反,取消预测),但我不相信我知道所有可能的问题,我只知道我们遇到的问题。

    此外,JAR文件的二进制差异将是无用的,您必须对类进行差异化,并将它们重新集成到JAR中(听起来不容易跟踪)。

    你能单独打包你的资源,然后把代码最小化一点吗?拉出字符串(对i18n很好)——我想我只是想知道您是否可以修剪类文件,使其足以始终执行完整的构建/传送。

    另一方面,Sun在制作与先前的JRE版本完全兼容的类文件方面似乎做得不错,因此它们必须在某个地方有指导方针。

        2
  •  2
  •   Thorbjørn Ravn Andersen    14 年前

    你可能想看看Java WebStart是否能帮助你,因为它被设计来完成你想做的事情。

    我知道文档描述了如何创建和执行增量更新,但是我们部署了整个应用程序,因为它很少更改。这是一个准备好时更新JNLP的问题。

        3
  •  1
  •   dime    14 年前

    它是如何部署的?

    在本地网络上,我只是将所有内容作为.class文件保存在一个文件夹中。启动脚本使用robocopy或rsync从网络共享复制到本地。如果任何.class文件不同,则会同步下来。如果不同步,则不同步。

    对于非本地网络,我创建了自己的更新程序。它下载一个MD5sums的文本文件,并与本地文件进行比较。如果不同,它会从HTTP中下拉文件。

        4
  •  0
  •   Codemwnci    14 年前

    很久以前,我们解决这个问题的方法是使用类路径和JAR文件。我们的应用程序构建在一个JAR文件中,它有一个启动器JAR文件。启动程序类路径有一个patch.jar,它在主application.jar之前被读取到类路径中。这意味着我们可以更新patch.jar来取代主应用程序中的任何类。

    然而,这是很久以前的事了。您可能会更好地使用类似Java Web启动类型的方法,它提供了更无缝的应用程序更新。