修补Java软件

时间:2010-09-17 19:50:56

标签: java patch versions

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

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

我基本上想弄明白 - 需要添加,替换或删除哪些文件。当我运行补丁时,它将检查软件的当前版本(来自注册表设置)并确保补丁用于正确的版本。如果是,它将进行必要的更改。这听起来并不像我自己太难实现,但我想知道其他人是否已经这样做了。如果有任何不同,我使用NSIS作为我的安装程序。

谢谢,

杰夫

4 个答案:

答案 0 :(得分:6)

这样做时要小心 - 我建议不要这样做。

最大的问题是公共静态变量。它们实际上被编译到目标中,没有被引用。这意味着即使java文件没有更改,也必须重新编译该类,否则您仍将引用旧值。

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

如果您决定沿着这条路走下去,请准备好一些非常难以调试的错误(通常没有痕迹或重要指示,只是奇怪的行为,例如收到的号码与发送的号码不匹配)在您无法复制的客户网站上很多生气的客户。

编辑(评论时间太长):

类文件的二进制差异可能有效,但我假设编译了某种版本号或日期,并且它们在每次编译时都会有一点变化,但是可以很容易地进行测试。

你可以采取一些严格的开发实践,不使用 public 最终静态(使它们成为私有),而不是每个更改方法签名(弃用),但我不相信我知道所有的可能的问题,我只知道我们遇到的问题。

Jar文件的二进制差异也没用,你必须对类进行差异化并将它们重新集成到jar中(听起来不容易跟踪)

您可以单独打包资源,然后稍微减少您的代码吗?拔出琴弦(适用于i18n) - 我想我只是想知道你是否可以修剪课程文件,以便始终完整制作/发货。

另一方面,Sun似乎可以很好地制作与之前的JRE版本完全兼容的类文件,因此他们必须在某处提供指导。

答案 1 :(得分:2)

您可能想看看Java WebStart是否可以帮助您,因为它旨在完成您想要做的事情。

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

答案 2 :(得分:1)

如何部署?

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

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

中删除文件

答案 3 :(得分:0)

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

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

相关问题