Java OSHI(操作系统和硬件信息)库 NoSuchMethodError

Java OSHI (Operating System and Hardware Information) library NoSuchMethodError

提问人:Thend 提问时间:8/10/2022 最后编辑:Daniel WiddisThend 更新时间:8/12/2022 访问量:846

问:

我在使用 OSHI API (https://github.com/oshi/oshi) 时收到以下错误。

我的 Maven 项目中有以下依赖项(我添加了 SLF4J 以根据其他 Stack Overflow 帖子修复错误,但没有帮助):

<!-- https://mvnrepository.com/artifact/com.github.oshi/oshi-core -->
<dependency>
    <groupId>com.github.oshi</groupId>
    <artifactId>oshi-core</artifactId>
    <version>6.2.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<!-- OSHI requires it!-->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.36</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.36</version>
    <scope>test</scope>
</dependency>

这是我使用 OSHI 的方式:

package controller;

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

public class SystemLoad extends Thread {

    public SystemLoad() {
    }

    @Override
    public void run(){
        while(true) {
            SystemInfo si = new SystemInfo();
            HardwareAbstractionLayer hal = si.getHardware();
            CentralProcessor cpu = hal.getProcessor();
            System.out.println( String.valueOf(cpu.getSystemCpuLoad(100)) );
        }
    }
}

这是我收到的错误代码:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "Thread-0" java.lang.NoSuchMethodError: 'void com.sun.jna.Memory.close()'
    at [email protected]/oshi.util.Util.freeMemory(Util.java:112)
    at [email protected]/oshi.jna.ByRef$CloseableLONGLONGByReference.close(ByRef.java:101)
    at [email protected]/oshi.util.platform.windows.PerfDataUtil.updateQueryTimestamp(PerfDataUtil.java:174)
    at [email protected]/oshi.util.platform.windows.PerfCounterQueryHandler.updateQuery(PerfCounterQueryHandler.java:134)
    at [email protected]/oshi.util.platform.windows.PerfCounterWildcardQuery.queryInstancesAndValuesFromPDH(PerfCounterWildcardQuery.java:164)
    at [email protected]/oshi.util.platform.windows.PerfCounterWildcardQuery.queryInstancesAndValues(PerfCounterWildcardQuery.java:87)
    at [email protected]/oshi.driver.windows.perfmon.ProcessorInformation.queryProcessorCounters(ProcessorInformation.java:167)
    at [email protected]/oshi.hardware.platform.windows.WindowsCentralProcessor.queryProcessorCpuLoadTicks(WindowsCentralProcessor.java:349)
    at [email protected]/oshi.util.Memoizer$1.get(Memoizer.java:87)
    at [email protected]/oshi.hardware.common.AbstractCentralProcessor.getProcessorCpuLoadTicks(AbstractCentralProcessor.java:204)
    at [email protected]/oshi.hardware.platform.windows.WindowsCentralProcessor.querySystemCpuLoadTicks(WindowsCentralProcessor.java:221)
    at [email protected]/oshi.util.Memoizer$1.get(Memoizer.java:87)
    at [email protected]/oshi.hardware.common.AbstractCentralProcessor.getSystemCpuLoadTicks(AbstractCentralProcessor.java:192)
    at [email protected]/oshi.hardware.CentralProcessor.getSystemCpuLoad(CentralProcessor.java:189)
    at hu.jhasher/controller.SystemLoad.run(SystemLoad.java:24)
    Suppressed: java.lang.NoSuchMethodError: 'void com.sun.jna.Memory.close()'
        at [email protected]/oshi.util.Util.freeMemory(Util.java:112)
        at [email protected]/oshi.jna.ByRef$CloseableHANDLEByReference.close(ByRef.java:115)
        at [email protected]/oshi.util.platform.windows.PerfCounterQueryHandler.removeAllCounters(PerfCounterQueryHandler.java:112)
        at [email protected]/oshi.util.platform.windows.PerfCounterQueryHandler.close(PerfCounterQueryHandler.java:166)
        at [email protected]/oshi.util.platform.windows.PerfCounterWildcardQuery.queryInstancesAndValuesFromPDH(PerfCounterWildcardQuery.java:146)
        ... 10 more
java jna nosuchmethoderror oshi

评论

1赞 Mark Rotteveel 8/10/2022
NoSuchMethodError 与 SLF4J 无关。这意味着您的类路径上可能有错误(太旧)的 JNA(Java Native Access)版本。前缀的行只是警告,表明您没有为 SLF4J 配置正确的日志记录库。SLF4J
0赞 Thend 8/10/2022
我更改了JNA版本,但仍然有问题。请检查我的更新。感谢!
0赞 Mark Rotteveel 8/10/2022
这表明问题已解决。如果您指的是那些 SLF4J 行,正如我所说,以 SLF4J 为前缀的日志行是由于您没有为 SLF4J 配置适当的日志记录库(您在测试范围上只有 slf4j-simple,因此没有用于主范围的日志记录库)
0赞 Mark Rotteveel 8/10/2022
无论如何,这是一个不同的问题,我将回滚您的编辑,因为您不应该移动问题的目标。关于 SLF4J 线路的问题可以通过 Stack Overflow 上的多个问题来解决,比如这个
0赞 Daniel Widdis 8/12/2022
这回答了你的问题吗?jna-platform 中的 NoSuchMethodError

答:

4赞 Mark Rotteveel 8/10/2022 #1

OSHI 6.2.2 需要 JNA (Java Native Access) 5.12.1,但看起来类路径上有旧版本的 JNA。该方法是在 JNA 5.12.0 中引入的。Memory.close()

检查 和 拉入了哪些依赖项,并在您自己的 POM (in ) 中添加显式依赖项,或者将其从拉入旧版本的库中排除,以便拉入 OSHI 定义的版本。mvn dependency:treenet.java.dev.jna:jnanet.java.dev.jna:jna-platformdependencyManagement