M1芯片Mac Monterey运行Scala/Play框架Web应用遇JNA加载错误
M1芯片Mac Monterey下Play框架启动报错:JNA临时库加载失败
问题详情
刚接触Mac系统与Scala/Play框架,本地部署Web应用时遇到异常:
- 用
sbt dist构建应用包正常 - 执行启动命令
run -Dconfig.file=./app.conf -Djdk.tls.trustNameService=true -Dhttps.port=8080 -Dhttp.port=8081时,抛出java.lang.UnsatisfiedLinkError,提示无法加载JNA临时库,推测与M1芯片架构相关,系统版本为Mac Monterey。
完整错误栈:
[error] java.lang.UnsatisfiedLinkError: Can't load library:/Users/roozbeh.merandi/Library/Caches/JNA/temp/jna6522888454902179447.tmp [error] at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2633) [error] at java.base/java.lang.Runtime.load0(Runtime.java:768) [error] at java.base/java.lang.System.load(System.java:1837) [error] at com.sun.jna.Native.loadNativeDispatchLibraryFromClasspath(Native.java:1018) [error] at com.sun.jna.Native.loadNativeDispatchLibrary(Native.java:988) [error] at com.sun.jna.Native.<clinit>(Native.java:195) [error] at io.methvin.watchservice.jna.CarbonAPI.<clinit>(CarbonAPI.java:20) [error] at io.methvin.watchservice.jna.CFStringRef.toCFString(CFStringRef.java:23) [error] at io.methvin.watchservice.MacOSXListeningWatchService.register(MacOSXListeningWatchService.java:127) [error] at io.methvin.watchservice.WatchablePath.register(WatchablePath.java:50) [error] at io.methvin.watcher.DirectoryWatcher.register(DirectoryWatcher.java:400) [error] at io.methvin.watcher.DirectoryWatcher.registerAll(DirectoryWatcher.java:373) [error] at io.methvin.watcher.DirectoryWatcher.<init>(DirectoryWatcher.java:193) [error] at io.methvin.watcher.DirectoryWatcher$Builder.build(DirectoryWatcher.java:122) [error] at play.dev.filewatch.DefaultFileWatchService.watch(DefaultFileWatchService.scala:44) [error] at play.dev.filewatch.FileWatchService$$anon$1.watch(FileWatchService.scala:95) [error] at play.runsupport.Reloader.<init>(Reloader.scala:443) [error] at play.runsupport.Reloader$.reloader$lzycompute$1(Reloader.scala:283) [error] at play.runsupport.Reloader$.play$runsupport$Reloader$$reloader$1(Reloader.scala:275) [error] at play.runsupport.Reloader$.startDevMode(Reloader.scala:301) [error] at play.sbt.run.PlayRun$.devModeServer$lzycompute$1(PlayRun.scala:100) [error] at play.sbt.run.PlayRun$.devModeServer$1(PlayRun.scala:83) [error] at play.sbt.run.PlayRun$.$anonfun$playRunTask$3(PlayRun.scala:107) [error] at play.sbt.run.PlayRun$.$anonfun$playRunTask$3$adapted(PlayRun.scala:67) [error] at scala.Function1.$anonfun$compose$1(Function1.scala:49) [error] stack trace is suppressed; run last Compile / run for the full output [error] (Compile / run) java.lang.UnsatisfiedLinkError: Can't load library: /Users/roozbeh.merandi/Library/Caches/JNA/temp/jna6522888454902179447.tmp
解决方案
- 添加JNA兼容参数:启动命令中加入
-Djna.nosys=true,强制JNA用纯Java实现,绕开M1架构兼容问题。修改后命令:run -Dconfig.file=./app.conf -Djdk.tls.trustNameService=true -Dhttps.port=8080 -Dhttp.port=8081 -Djna.nosys=true - 清理JNA缓存:手动删除JNA缓存目录,让系统重新生成适配库:
删除后重新执行启动命令。rm -rf ~/Library/Caches/JNA/ - 切换文件监听实现:在
application.conf中添加配置,改用JDK原生文件监听服务:play.filewatchService = "play.dev.filewatch.JdkFileWatchService" - 使用M1兼容JDK:确保当前JDK为arm64架构版本,避免用x86_64架构JDK通过Rosetta转译运行。
内容的提问来源于stack exchange,提问作者Rosso
相关产品推荐
相关产品推荐

