M1 Mac构建遗留Java应用:mvn clean install报错找不到sun.misc.BASE64类
解决M1 Mac编译遗留Java项目时sun.misc.BASE64类找不到的问题
问题场景
在M1 Mac终端执行mvn clean install(已尝试Rosetta和原生模式)时,出现编译错误:
[ERROR] /Users/danieljohnson/Documents/manage/og/gems/ems/src/main/java/com/ems/hvac/utils/CryptographyUtil.java:[34,16] cannot find symbol symbol: class BASE64Decoder location: package sun.misc [ERROR] /Users/danieljohnson/Documents/manage/og/gems/ems/src/main/java/com/ems/hvac/utils/CryptographyUtil.java:[35,16] cannot find symbol symbol: class BASE64Encoder location: package sun.misc
当前使用的JDK版本:
openjdk version "1.8.0_345" OpenJDK Runtime Environment (Zulu 8.64.0.19-CA-macos-aarch64) (build 1.8.0_345-b01) OpenJDK 64-Bit Server VM (Zulu 8.64.0.19-CA-macos-aarch64) (build 25.345-b01, mixed mode)
保留sun.misc的解决办法
1. 调整Maven编译插件参数,允许访问内部API
JDK 8开始默认限制了对sun.misc这类内部包的编译访问,需在pom.xml的maven-compiler-plugin中添加编译参数:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <source>1.8</source> <target>1.8</target> <compilerArgs> <!-- 忽略符号文件,允许访问sun.misc内部类 --> <arg>-XDignore.symbol.file</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>
修改后重新执行mvn clean install即可。
2. 切换到x86_64架构的JDK 8(Rosetta模式)
M1原生的aarch64版本JDK 8对内部API的打包逻辑可能存在差异,可尝试切换到x86_64版本的Zulu 8:
- 下载并安装x86_64版本的Zulu OpenJDK 8
- 在终端中切换JDK环境:
export JAVA_HOME=/path/to/zulu-8-x86_64 - 重新执行编译命令
3. 引入包含sun.misc类的第三方依赖(备选)
如果上述方法无效,可尝试引入包含sun.misc.BASE64Encoder/Decoder的依赖到pom.xml:
<dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0.1</version> <scope>compile</scope> </dependency>
注意:该依赖可能引入额外的兼容性问题,仅作为最后备选方案。
额外建议
虽然上述方法能临时解决编译问题,但sun.misc属于JDK内部API,已被废弃且在后续JDK版本中可能被完全移除。如果项目需要长期维护,建议逐步替换为标准库的java.util.Base64(JDK 8及以上支持),替换示例:
原代码:
import sun.misc.BASE64Encoder; import sun.misc.BASE64Decoder; // 编码操作 String encodedStr = new BASE64Encoder().encode(originalBytes); // 解码操作 byte[] decodedBytes = new BASE64Decoder().decodeBuffer(encodedStr);
替换为:
import java.util.Base64; // 编码操作 String encodedStr = Base64.getEncoder().encodeToString(originalBytes); // 解码操作 byte[] decodedBytes = Base64.getDecoder().decode(encodedStr);
内容的提问来源于stack exchange,提问作者Daniel Johnson
相关产品推荐
相关产品推荐

