当前位置: 首页 > 面试题库 >

修补Java软件

穆锋
2023-03-14
问题内容

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

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

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

谢谢,

杰夫


问题答案:

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

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

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

如果您决定走这条路,请准备好在客户站点上进行一些非常难于调试的错误(通常没有任何痕迹或明显的指示,只是奇怪的行为,例如收到的数字与发送的数字不匹配),并且您无法重复做很多激怒顾客。

编辑(评论太长):

类文件的二进制差异可能会起作用,但我假设已编译了某种版本号或日期,并且每次编译时它们都会无故更改,但可以轻松进行测试。

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

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

您可以单独打包资源,然后将代码最小化吗?拉出字符串(对i18n有用)-我想我只是想知道您是否可以对类文件进行足够的修剪以始终执行完整的构建/发布。

另一方面,Sun似乎做得很好,可以制作与以前的JRE发行版完全兼容的类文件,因此它们必须在某些地方提供指导。



 类似资料:
  • 问题内容: 我知道,如果go代码的结构使其可以编程为接口,那么模拟起来就很简单了。但是,我正在使用无法更改的代码库(不是我的),情况并非如此。 该代码库是高度互连的,并且仅对结构进行编程,而没有对接口进行编程,因此没有依赖项注入。 这些结构本身仅包含其他结构,因此我也无法以这种方式进行模拟。我不相信我可以对方法做任何事情,并且存在的少数几个函数不是变量,所以我不知道如何将它们换出。继承在golan

  • 图像修补 作者|OpenCV-Python Tutorials 编译|Vincent 来源|OpenCV-Python Tutorials 目标 在本章中, 我们将学习如何通过一种称为“修复”的方法消除旧照片中的小噪音,笔画等。 我们将看到OpenCV中的修复功能。 基础 你们大多数人家里都会有一些旧的旧化照片,上面有黑点,一些笔触等。你是否曾经想过将其还原?我们不能简单地在绘画工具中擦除它们,因

  • 问题内容: 我遇到了有关monkey修补Django的帖子: 我知道这不是理想的选择,最好User通过单独的模型添加字段和函数Profile。 话虽如此,我只想了解这是如何工作的: 我将把monkey补丁代码放在哪里? 代码何时运行-仅运行一次?每个Python解释器启动一次?每个请求一次? 大概我仍然需要更改数据库架构。因此,如果我放下桌子运行,会syncdb“知道”是否已添加新字段吗?如果没有

  • 我正在尝试进行http补丁请求,但我总是得到404错误,所以可能是我的连接设置不正确: 我收到404错误,未找到。当使用Postman执行相同的请求时,这是有效的…谢谢你的帮助。

  • 问题内容: 我遇到了有关猴子修补Django的帖子: 我知道这不是理想的选择,最好通过单独的模型添加字段和函数。 话虽如此,我只想了解这将如何工作: 我将把monkey补丁代码放在哪里? 代码何时运行-仅运行一次?每个Python解释器启动一次?每个请求一次? 大概我仍然需要更改数据库架构。因此,如果我放下桌子运行,会“知道”是否已添加新字段吗?如果没有,如何更改架构? 问题答案: 您可以将其放置

  • 我对PersondTo有以下定义: 下面是一个示例记录: 现在,无名氏离婚了。所以我需要向这个URL发送补丁请求: 我想不出该怎么做。以下是我到目前为止所做的尝试: 以下是上面的问题: 1)由于我只设置了MaritalStatus,其他字段都将为null。因此,如果我打印出请求,它将如下所示: 请欣赏那些编写客户机应用程序的人提出的使用Spring的RESTTemplate使用Restful we