Java 8与Java 17中System.getProperty("os.arch")返回值差异导致方法行为不一致的问题咨询
Java 8与Java 17中System.getProperty("os.arch")返回值差异导致方法行为不一致的问题咨询
嗨,我来帮你梳理下这个问题的原因和解决办法:
首先,你遇到的核心差异是Java 8和Java 17在Apple Silicon(M2)Mac上的架构识别逻辑不同:
- 在Java 8时代,官方还没有推出原生支持Apple Silicon的JDK,大家都是用x86_64版本的Java 8,通过Mac的Rosetta 2转译来运行的。这时候
System.getProperty("os.arch")会返回转译后的架构标识x86_64,所以你的方法会走到amd64的分支,返回x86_64。 - 而Java 17已经有了原生支持Apple Silicon的JDK版本(aarch64架构),如果你安装的是这个原生版本,JDK会直接识别到M2的arm架构,
os.arch就会返回aarch64,这时候你的方法会走到对应分支返回armv7l,和Java 8的结果不一样。
如果想要让两个Java版本的输出一致,你有两种可选方案:
- 使用x86_64版本的Java 17
安装针对x86_64架构的Java 17,然后通过Rosetta 2运行(比如在终端里用arch -x86_64 java命令启动程序),这样os.arch会和Java 8一样返回x86_64,你的方法行为就会完全一致。 - 修改代码逻辑适配原生架构
如果你想保留原生aarch64版本的Java 17,同时让输出和Java 8一致,可以调整你的getArchSuffix方法,把aarch64映射到x86_64而不是armv7l,修改后的代码如下:static String getArchSuffix() { String arch = System.getProperty("os.arch"); if (arch.equals("i686")) { return "x86"; } else if (arch.equals("amd64") || arch.equals("aarch64")) { return "x86_64"; } else if (arch.equals("nacl")) { return "armv7l"; // 这里注意:nacl和armv7l没有关联,可能是之前的笔误,建议检查下 } return arch; }
另外补充一点:你代码里把nacl映射到armv7l可能是个错误,nacl是谷歌的Native Client技术,和armv7l架构没有直接关系,建议你确认下这个分支的逻辑是否合理。
备注:内容来源于stack exchange,提问作者omar mahameed
相关产品推荐
相关产品推荐

