Windows环境下Lanterna无法识别JNA及jna-platform依赖的解决咨询
我开发了一个Lanterna TUI程序,在Ubuntu上运行正常,目前正在Windows 11上测试。使用javaw命令运行时,会创建独立终端,但移动光标时会出现卡顿。因此尝试将JNA和jna-platform添加到类路径,不过尽管确认文件存在,JNA仍未被识别。
我从JNA仓库下载了5个jar文件,路径如下:
- C:\temp\windows_requirements\jna-5.14.0.jar
- C:\temp\windows_requirements\jna-jpms-5.14.0.jar
- C:\temp\windows_requirements\jna-platform-5.14.0.jar
- C:\temp\windows_requirements\jna-platform-jpms-5.14.0.jar
- C:\temp\windows_requirements\win32-x86-64.jar
方案一:Gradle依赖添加
在build.gradle文件的依赖中添加JNA:
dependencies { ... // Use Lanterna on Windows implementation 'net.java.dev.jna:jna:5.14.0' ... }
该方案在Ubuntu上编译运行正常,但Windows仍报错。
方案二:命令行指定类路径
执行以下命令:
java -classpath "C:temp\windows_requirements\jna-5.14.0.jar;C:\temp\windows_requirements\jna-platform-5.14.0.jar;C:\temp\some-project-all.jar" -jar some-project-all.jar
执行后仍出现相同错误。
方案三:动态修改类路径+ShadowJar打包
确保build.gradle中包含JNA依赖,执行clear && ./gradlew build shadowJar生成包含所有依赖的jar包,运行命令java -jar build/libs/some-project-all.jar,输出显示类路径已更新,但仍抛出错误:
Classpath=some-project-all.jarEND Updated Classpath: some-project-all.jar;C:\temp\windows_requirements\jna-5.14.0.jar;C:\temp\windows_requirements\jna-platform-5.14.0.jar .... java.IOException: To use Lanterna on Windows, either add JNA (and jna-platform) to the classpath or use javaw!
如何确保Windows环境下的some-project-all.jar能识别JNA及jna-platform依赖?
- Ubuntu:OpenJDK 19.0.2
- Windows:Java 21.0.1 LTS
1. 补全Gradle依赖配置
Lanterna在Windows上需要同时依赖jna和jna-platform,修正build.gradle的依赖块:
dependencies { // 替换为你实际使用的Lanterna版本 implementation 'com.googlecode.lanterna:lanterna:3.2.0' // Windows环境必需的JNA依赖 implementation 'net.java.dev.jna:jna:5.14.0' implementation 'net.java.dev.jna:jna-platform:5.14.0' }
2. 正确配置ShadowJar打包
确保ShadowJar将JNA的所有依赖(包括native库)打包到最终jar中,在build.gradle中添加ShadowJar配置:
plugins { id 'java' id 'com.github.johnrengelman.shadow' version '8.1.1' } shadowJar { // 合并JNA的服务文件,确保native库加载正常 mergeServiceFiles() // 指定主类,允许直接用java -jar运行 manifest { attributes 'Main-Class': '你的主类全路径' } }
重新执行打包命令:
./gradlew clean shadowJar
生成的jar文件在build/libs/目录下,直接运行即可:
java -jar build/libs/some-project-all.jar
3. 修正命令行运行的类路径错误
之前的命令行存在路径拼写错误(C:temp缺少反斜杠),且-jar参数会忽略手动指定的-cp,正确命令如下:
java -cp "C:\temp\windows_requirements\jna-5.14.0.jar;C:\temp\windows_requirements\jna-platform-5.14.0.jar;C:\temp\some-project-all.jar" 你的主类全路径
4. 确保JNA Native库被加载
如果手动下载了win32-x86-64.jar,需要将其加入类路径;或者直接通过Gradle自动获取对应平台的native库:
implementation 'net.java.dev.jna:jna-platform:5.14.0:natives-windows-x86-64'
5. 版本兼容性检查
确认Lanterna版本与JNA版本兼容(Lanterna 3.x系列适配JNA 5.x),Java 21与JNA 5.14.0兼容,无需降级Java版本。
内容的提问来源于stack exchange,提问作者a.t.

