java.io.IOException:要在 Windows 上使用 Lanterna,请将 JNA(和 jna-platform)添加到类路径(或使用 javaw)

问题描述 投票:0回答:1

背景

我创建了一个 Lanterna TUI,它在 Ubuntu 上完美运行,我正在 Windows 11 上测试它。当我使用

javaw
运行命令时,会创建一个单独的终端,一旦移动光标,该终端就会出现故障。因此我尝试将 JNA 和 jna-platform 添加到类路径中。然而,JNA 没有被识别,尽管我相信它在类路径中。

我从此存储库上列出的这 5 个链接下载了 JNA jar 文件:

生成文件:

  • C: emp\windows_requirements\jna-5.14.0.jar
  • C: emp\windows_requirements\jna-jpms-5.14.0.jar
  • C: emp\windows_requirements\jna-platform-5.14.0.jar
  • C: emp\windows_requirements\jna-platform-jpms-5.14.0.jar
  • C: emp\windows_requirements\win32-x86-64.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 平台)?

Java版本

我在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
java windows jna
1个回答
0
投票

在 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 上进行了验证。

© www.soinside.com 2019 - 2024. All rights reserved.