我的程序依靠以下代码来获取可用的系统内存:
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
依赖于jna
和jna-platform
。在Dependency Hierarchy
中,我看到两者都已解析(编译)为版本5.5.0
。
导致此错误的原因以及如何解决?
谢谢!
P.S
我见过其他一些具有类似错误的线程,但是找不到任何具有此确切问题的线程(缺少com/sun/jna/platform/win32/Psapi
)
似乎oshi-core
依赖于Sun / Oracle JVM的内部未记录的功能,而您正在运行的其他和/或更新的JVM不再具有该[[未记录的功能。这就是使用未记录的功能的风险。
oshi-core
的较新/其他版本,或切换为使用oshi-core
支持的JVM。jna-platform
(或可能在项目上链接了多个版本)类路径)。 NoClassDefFoundError
几乎总是这种情况,并且在朝正确的方向进行故障排除时,证据表明您的项目中某个地方存在旧的jna-platform
版本。com.sun.jna.platform.win32.VersionHelpers
类在com.sun.jna.platform.win32.VersionHelpers
版本5.3.0及更高版本中。给您错误的方法调用所需的jna-platform
方法在GetPerformanceInfo()
类中,在com.sun.jna.platform.win32.Psapi
版本4.3.0及更高版本中。如果您的类加载器找不到这些类,则说明您没有正确的jar链接到您的项目-或者您在正确的jar旁边链接了不正确的jar。
com.sun.jna.platform.win32.Psapi
...首先,它执行您在POM中列出的所有依赖项(按顺序),然后执行那些项目的可传递依赖项(按顺序),依此类推。确保可以使用以下任一(或两者)实施最新版本的JNA:
jna-platform
依赖关系在您的POM中,特别是在任何依赖于JNA的早期版本。 oshi-core
版本(5.5.0)。jna
菜单,以确保POM更改后您的依赖项保持同步。[您的本地存储库可能没有下载更新的jar,在这种情况下,您可以清除它(或仅从jna-platform
删除任何JNA工件或所有东西,然后让它重建。]
还要检查Eclipse中的类路径。如果您在设置POM以从Maven获取依赖之前手动添加了依赖(例如,添加到JNA),则可以使用它们。
如果上述提示不能解决您的问题,请在Update Maven Project文件中发布依赖项部分的内容,以便我们提供其他建议。