修补Java软件

Jef*_*rey 5 java patch versions

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

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

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

谢谢,

杰夫

Bil*_*l K 6

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

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

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

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

编辑(评论时间太长):

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

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

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

你可以单独打包你的资源然后稍微减少你的代码吗?拉出字符串(适用于i18n) - 我想我只是想知道你是否可以修改类文件,以便始终完成构建/发送.

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