![]() |
1
6
做这个的时候要小心——我建议你不要做。 最大的问题是公共静态变量。它们实际上被编译到目标中,而不是被引用。这意味着,即使Java文件没有改变,类必须重新编译,或者仍然引用旧的值。 您还需要非常小心地更改方法签名——如果您更改方法签名,并且不重新编译调用该方法的所有文件,即使调用的Java文件实际上不需要更改(例如,将参数从int更改为L),也会得到一些非常微妙的错误。东) 如果你决定沿着这条路走下去,那么就要准备好在客户网站上出现一些非常难以调试的错误(通常没有痕迹或明显的迹象,只是收到的数字与发送的数字不匹配等奇怪的行为),而这些错误是你无法复制的,并且会让很多客户恼火。 编辑(注释太长):类文件的二进制差异可能会起作用,但我假设编译了某种版本号或日期,并且它们会无缘无故地改变每个编译,但这很容易测试。 您可以采取一些不使用的严格的开发实践 公众的 最终的静态(使它们成为私有的)和不是所有更改的方法签名(相反,取消预测),但我不相信我知道所有可能的问题,我只知道我们遇到的问题。 此外,JAR文件的二进制差异将是无用的,您必须对类进行差异化,并将它们重新集成到JAR中(听起来不容易跟踪)。 你能单独打包你的资源,然后把代码最小化一点吗?拉出字符串(对i18n很好)——我想我只是想知道您是否可以修剪类文件,使其足以始终执行完整的构建/传送。 另一方面,Sun在制作与先前的JRE版本完全兼容的类文件方面似乎做得不错,因此它们必须在某个地方有指导方针。 |
![]() |
2
2
你可能想看看Java WebStart是否能帮助你,因为它被设计来完成你想做的事情。 我知道文档描述了如何创建和执行增量更新,但是我们部署了整个应用程序,因为它很少更改。这是一个准备好时更新JNLP的问题。 |
![]() |
3
1
它是如何部署的? 在本地网络上,我只是将所有内容作为.class文件保存在一个文件夹中。启动脚本使用robocopy或rsync从网络共享复制到本地。如果任何.class文件不同,则会同步下来。如果不同步,则不同步。 对于非本地网络,我创建了自己的更新程序。它下载一个MD5sums的文本文件,并与本地文件进行比较。如果不同,它会从HTTP中下拉文件。 |
![]() |
4
0
很久以前,我们解决这个问题的方法是使用类路径和JAR文件。我们的应用程序构建在一个JAR文件中,它有一个启动器JAR文件。启动程序类路径有一个patch.jar,它在主application.jar之前被读取到类路径中。这意味着我们可以更新patch.jar来取代主应用程序中的任何类。 然而,这是很久以前的事了。您可能会更好地使用类似Java Web启动类型的方法,它提供了更无缝的应用程序更新。 |