我创建了一个 Lanterna TUI,它在 Ubuntu 上完美运行,我正在 Windows 11 上测试它。当我使用
javaw
运行命令时,会创建一个单独的终端,一旦移动光标,该终端就会出现故障。因此我尝试将 JNA 和 jna-platform 添加到类路径中。然而,JNA 没有被识别,尽管我相信它在类路径中。
我从此存储库上列出的这 5 个链接下载了 JNA jar 文件:
生成文件:
我尝试使用以下方法将 jna 包含在
gradle.build
文件的依赖项中:
dependencies {
...
// Use Lanterna on Windows
implementation 'net.java.dev.jna:jna:5.14.0'
...
}
即使它编译并运行得很好(在 Ubuntu 上),但在 Windows 上它仍然会抛出与下面相同的错误。
然后尝试使用以下方法包含 jna 和 jna 平台:
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
但是,输出与下面相同的错误。
我更改了类路径,首先断言系统上存在 jna 和 jna-platform
.jar
文件,然后使用以下命令将它们添加到类路径:
String classpath = System.getProperty("java.class.path");
System.out.println("Classpath="+classpath+"END");
File jnaJarFile = new File("C:/temp/windows_requirements/jna-5.14.0.jar");
File jnaPlatformJarFile = new File("C:/temp/windows_requirements/jna-platform-5.14.0.jar");
if (!jnaJarFile.exists() || !jnaJarFile.isFile()) {
throw new FileNotFoundException("jnaJarFile:"+jnaJarFile.getAbsolutePath()+" does not exist.");
}
if (!jnaPlatformJarFile.exists() || !jnaPlatformJarFile.isFile()) {
throw new FileNotFoundException("jnaPlatformJarFile:"+jnaPlatformJarFile.getAbsolutePath()+" does not exist.");
}
// Append the directory or JAR file to the classpath
classpath += ";"+jnaJarFile+";"+jnaPlatformJarFile; // Use ; as separator in Windows
// Set the updated classpath
System.setProperty("java.class.path", classpath);
// Print the updated classpath
System.out.println("Updated Classpath: " + System.getProperty("java.class.path"));
此外,我确保 jna 依赖项位于
build.gradle
文件中,然后使用该文件创建包含所有依赖项的 .jar
,其中使用: clear && ./gradlew build shadowJar
:
implementation 'net.java.dev.jna:jna:5.14.0'
这个包含所有依赖项的
.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! (see https://github.com/mabe02/lanterna/issues/335)
如何确保
some-project-all.jar
文件能够识别 Windows 上的 JNA(和 jna 平台)?
我在Ubuntu上使用的java版本是通过以下方式找到的:
java --version
openjdk 19.0.2 2023-01-17
OpenJDK Runtime Environment (build 19.0.2+7-44)
OpenJDK 64-Bit Server VM (build 19.0.2+7-44, mixed mode, sharing)
在 Windows 上:
java 21.0.1 2023-10-17 LTS
JRE: 21.0.1+12-LTS-29
在 Daniel Widdis 的评论中找到了解决方案。问题是我没有将
jna-platform
包含在 build.gradle
文件中。我已经在 jna
中包含了 build.gradle
依赖项,但是,我也没有包含 jna-platform
依赖项。将两者都包括在内后:
dependencies {
// Use Lanterna on Windows
implementation 'net.java.dev.jna:jna:5.14.0'
implementation 'net.java.dev.jna:jna-platform:5.14.0'
}
并编译了 jar,它在 Windows 上显示了 Lanterna TUI,没有
javaw
显示的故障。在 Ubuntu 23.04 虚拟机上的 Windows 11 上进行了验证。