不一定!
虽然Java在诞生之初,设计的主要目标就是跨平台,并且也做了很多事情来让这个成为可能,也是很多年来Java的一个重要优势。
其中比较重要的就是通过JVM的平台有关来实现了java语言的平台无关。也就是说只要设备上安装了相应平台的 JVM,Java 程序就可以在任何平台上运行,不需要做任何修改。这就是“一次编写,到处运行(Write Once, Run Anywhere,)”的理念。
但是,这个事儿在现如今为了适应云原生,推出了很多静态编译的手段。比如AOT和Native Image:
不管是通过AOT编译把代码翻译成机器码,还是Native Image来消除JVM,最终都是是平台相关的了。
明明Java是靠着跨平台,平台无关性起家的,并且这么多年来这一直都是他的一个非常大的优势, 为什么如今要走到一条平台有关的路上来呢?
主要是因为在当今的云原生 Serverless的环境下,平台无关已经不再那么重要了。而且很多时候我们的代码都是部署在k8s、docker等容器中的。所以很多时候我们都不太关心具体的部署工作,而是交给云服务商直接完成了。而至于底层的具体运行的环境差别并没有那么明显了。
而牺牲一定的平台无关性,可以带来更快地启动速度、更好的资源利用、提供更加简单的部署过程,何乐而不为呢?
所以,这并不是削弱了 Java 的平台无关性,而是为了在特定场景下获得更好的性能和资源利用率,选择了牺牲一定程度的平台无关性。