1

我的程序依赖以下代码来获取可用的系统内存:

import oshi.SystemInfo;
import oshi.hardware.HardwareAbstractionLayer;


SystemInfo si = new SystemInfo();
HardwareAbstractionLayer hal = si.getHardware();

// Next line throws exception: NoClassDefFoundError -> com/sun/jna/platform/win32/Psapi
long availableBytes = hal.getMemory().getAvailable();
double availableMegabytes = ((double) availableBytes) / 1048576;
double availableGigabytes = ((double) availableMegabytes)/1024;

更新:oshi-core在从每个项目中删除每个事件之后Workspace(以消除暂时冲突依赖的可能性 - 只剩4.2.1下)。现在我得到的错误是->java.lang.NoClassDefFoundError: com/sun/jna/platform/win32/VersionHelpers

pom.xml我添加了oshi-core依赖项 - 我已经尝试了从版本3.4.0到最新版本的几乎每个版本4.2.1,它们都导致相同的错误。

我意识到oshi-core依赖于jnaand jna-platform。在Dependency Hierarchy我看到两者都已解析(编译)为 version 5.5.0

是什么导致了这个错误,如何解决?

谢谢!

附言

我已经看到其他一些有类似错误的线程,但找不到任何有这个确切问题的线程(缺少com/sun/jna/platform/win32/Psapi

4

2 回答 2

2

虽然您在评论中指出您认为最新版本的 JNA 正在解决,但错误表明您的项目没有最新版本jna-platform(或者可能在类路径上链接了多个版本)。这几乎总是如此NoClassDefFoundError,当您在正确的方向进行故障排除时,有证据表明jna-platform您的项目中某处存在旧版本。

com.sun.jna.platform.win32.VersionHelpers课程的jna-platform版本为 5.3.0 及更高版本。给出错误的GetPerformanceInfo()方法调用所需的方法在com.sun.jna.platform.win32.Psapi类中,jna-platform版本为 4.3.0 及更高版本。如果您的类加载器找不到这些类,那么您的项目没有链接到正确的 jar - 或者您将不正确的 jar 与正确的 jar 链接在一起。

Maven 按级别解决依赖关系......首先它会处理您在 POM 中列出的所有依赖项(按顺序),然​​后是这些项目的传递依赖项(按顺序)等等。确保使用最新版本的 JNA 可以通过以下任一(或两者)来强制执行:

  • 在 POM 的依赖项列表中更早地指定oshi-core依赖项,特别是在任何依赖于早期 JNA 版本的项目之前。
  • 在顶级 POM 中显式指定jna和 版本 (5.5.0)。jna-platform

此外,在 Eclipse 中,请务必通过菜单更新 Maven 项目,以确保在 POM 中更改后您的依赖项保持同步。

您的本地存储库可能没有下载更新的 jar,在这种情况下,您可以清除它(或者只是删除任何 JNA 工件或所有内容,C:\Users\<username>\.m2\repository然后让它重建。)

还要检查 Eclipse 中的类路径。如果您在设置 POM 以从 Maven 获取依赖项之前手动添加了依赖项(例如,添加到 JNA),那么您可能正在使用这些依赖项。

如果上述提示不能解决您的问题,请将依赖项部分的内容发布到您的pom.xml文件中,以便我们提供更多建议。

于 2019-11-21T15:09:00.803 回答
0

似乎oshi-core依赖于 Sun / Oracle JVM 的内部未记录功能,并且您在不再具有该未记录功能的不同和/或更新的 JVM 上运行。这就是使用未记录功能的风险。

获取oshi-core支持您正在使用的 JVM 版本的更新/其他版本,或切换到使用oshi-core支持的 JVM。

于 2019-11-21T02:35:45.533 回答