Windows 中的 Java 程序认为操作系统是 Linux

Windows 中的 Java 程序认为操作系统是 Linux

我正在运行一个由我工作单位制作的用 Java 编写的程序。它依赖于 libjpeg-turbo (版本 1.5.1 vc64)。从 Windows 命令行 (CMD.exe) 运行它时,发生了 Java 异常,并显示以下错误消息:

Exception in thread "pool-1-thread-1" java.lang.UnsatisfiedLinkError: Expecting an absolute path of the library: /opt/libjpeg-turbo/lib32/libturbojpeg.so

我在 Windows 10 上运行它,但它似乎在 Linux 位置寻找 libjpeg-turbo。我认为它假设操作系统是 Linux 系统,而不是 Windows。我已经让它在另一台 Windows 10 计算机上正常工作。我在两台计算机上都启用了 WSL,使用 Ubuntu 发行版。也许这与它有关?

有什么想法可能导致这种情况吗?我正在与开发人员合作解决这个问题,但我认为通过这个问题看看我们是否可以获得一些外部帮助也没什么坏处。

其他信息:(如果需要更多信息请告诉我)

  • Windows 10,64 位
  • WSL、Ubuntu 发行版
  • Java 8(截至 2019 年 4 月 21 日最新)
  • libjpeg-turbo 1.5.1-vc64,安装在 Windows 10 上,不是通过 WSL

答案1

您应该问自己,为什么该程序可以在一台 Windows 计算机上运行,​​而在另一台计算机上却不能运行。肯定有什么地方不同。如果您将程序从正在运行的计算机复制到另一台计算机,会发生什么情况?也许您需要将任何 libjpeg-turbo 文件复制到特殊位置?

看来程序没有找到 libjpeg-turbo,因此尝试从中加载它/opt/libjpeg-turbo/lib32/libturbojpeg.so

在程序启动时将变量设置PATH到正确的位置PATH=C:\path-to-libjpeg-turbo;%PATH% 或使用属性。-Djava.library.path=C:\path-to-libjpeg-turbo

答案2

由于您有两台计算机,并且该程序在一台计算机上可以运行,而在另一台计算机上却不行,因此您可以进行一些比较,看看它们之间有什么不同。以下是一些可能的候选程序,按照我检查它们的大致顺序:

  1. 两台机器上的程序是否相同?虽然 Java 软件旨在实现可移植性,但有时人们会为不同的平台构建不同的版本,并且您可能不小心在一台机器上下载了 Linux。您可以对两个 JAR 文件进行哈希处理以进行比较。
  2. 两台机器上调用程序的方式是否相同?如果您正在运行脚本或可执行文件(而不仅仅是调用java.exejavaw.exe自己),两台机器上的调用程序是否相同?这些 Java 启动包装器通常是特定于平台的,并且根据您机器上安装的内容,它可能会运行为 Linux 编写的包装器,足以导致您看到的故障。
  3. 两台机器上的 Java 运行时是否相同?虽然这在这种特殊情况下并不重要,但 JRE 可能非常不稳定,您应该验证两台机器上安装的版本是否完全相同(包括 32 位和 64 位)。
  4. 是否存在导致某台机器混乱的环境变量?虽然程序应该询问 Java 运行时它所处的操作系统,而不是检查环境变量之类的东西来尝试找出原因,但有时人们做事的方式不正确,有时环境变量会产生意想不到的效果。
  5. 两台机器的安装位置是否相同(或足够接近)?其中一台机器的路径中有空格,而另一台机器没有,这可能会导致一些常见的错误。
  6. 工作机器的副本加载了哪些库,这些库在非工作机器上是否位于同一位置?您可以使用 Windows 的内置资源监视器(或其他一些工具)查看程序已加载哪些库。
  7. 每个程序进行哪些系统调用,它们在工作系统和非工作系统之间有何不同?您可以使用 Sysinternals 工具套件(由 Microsoft 拥有,可在线免费获取)中的 Process Monitor 来跟踪每个系统上的程序;在某些时候,它们可能会出现分歧(无论是在系统调用参数中还是在响应中),分歧的位置和性质可能会提供足够的信息来找出差异是什么,或者至少找出下一步要查看的地方(如果没有,请在此处询问!)。

相关内容