Mac下FakeSMTP报IllegalAccessError启动失败问题咨询
问题根因
这个报错属于Java模块系统(JPMS)的访问权限拦截,核心原因是你当前启动fakeSMTP时实际调用的JDK并非你以为的Java 8,而是Java 9及以上版本。com.apple.eawt是Mac平台专属的Java桌面集成包,在Java 8版本中该包默认对所有类路径下的代码开放访问,不会触发权限报错;Java 9引入模块化系统后,com.apple.eawt被划到java.desktop模块内部,默认不向未命名模块(也就是直接从jar包启动的非模块化应用)导出,才会出现你贴的报错。
你之前4-5年能正常运行,是因为此前终端环境默认调用的是Java 8,近期大概率是安装其他开发工具、系统更新时自动带装了高版本JDK,修改了系统PATH中的Java执行优先级,哪怕你本地留存了jdk1.8.0_261,sudo执行时优先加载的也是高版本Java。
排查步骤
- 第一步先确认sudo环境下实际生效的Java版本,终端执行命令:
查看输出的版本号,如果不是1.8.0_261,即可确认是默认JDK版本被篡改导致的问题。sudo java -version - 第二步确认本地Java 8的安装路径,Mac系统JDK默认存放在
/Library/Java/JavaVirtualMachines/目录下,执行:
确认ls /Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk目录存在,记录下完整路径。
可行解决方案
按稳定性从高到低排序:
- 方案1:启动时直接指定Java 8的绝对路径,完全绕开系统默认Java配置,是最稳妥的方案,启动命令参考:
执行后即可正常启动程序,不会受后续系统Java版本变动影响。sudo /Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home/bin/java -jar fakeSMTP-2.0.jar - 方案2:修正sudo环境下的默认Java版本。将Java 8的路径配置为shell环境的最高优先级,在对应shell配置文件(
~/.bash_profile或~/.zshrc,根据你用的终端选择)中添加JAVA_HOME配置指向Java 8路径,执行source命令加载配置后,用sudo -E参数继承当前用户环境变量启动:
注意sudo默认会重置用户环境变量,不加sudo -E java -jar fakeSMTP-2.0.jar-E参数还是会调用系统默认的高版本Java。 - 方案3:如果必须使用高版本Java启动,添加JVM启动参数强制开放模块访问权限,命令如下:
该方案存在后续触发其他内部包访问报错的可能,不推荐优先使用。sudo java --add-exports java.desktop/com.apple.eawt=ALL-UNNAMED -jar fakeSMTP-2.0.jar
内容的提问来源于stack exchange,提问作者Singam
相关产品推荐
相关产品推荐

