
Java
这并不是完整的事实。很多人认为
Java 升级困难,但实际上,
Java 本身升级并没有那么复杂,真正让人头疼的是那些依赖的开发框架。这些框架可能已经用了近十年,跨度太大,导致升级时面临诸多挑战。如果只是单纯升级
Java,其实很简单,无非是下载新版本软件,最多调整一下配置参数。相比之下,虽然 Go 的版本升级看起来容易,因为你只需更新其运行时工具链和标准库即可,但如果你尝试升级一些常用的第三方库,比如 gin 或 gorm,即使是小版本升级,也可能遇到各种问题。因此,所谓的容易只是表象。另外,
Java 核心语言至今几乎没有引入过任何破坏性变更(breaking change)。许多人提到的 JPMS 模块化系统以及对反射的限制,只有在启用相关新功能时才会显现影响。如果你不使用这些新特性,原有代码完全可以正常运行,完全不会受到干扰。此外,很多升级过程中遇到的问题,实际上是因为某些库或框架采用了非官方手段访问了未公开的 API,或者对 JVM 和
Javac 的具体实现做了特定假设。即便如此,
Java 也提供了许多兼容性选项,可以通过一些逃生门标志(flags)来解决这些问题。这种不兼容性其实是正常的。举个例子,Go 在 1.17 版本中修改了函数调用约定,结果导致大量依赖汇编代码或通过特殊手段操作 runtime 的代码失效。类似的情况在任何语言中都可能发生,不能简单归咎于语言本身的设计问题。