在使用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 com.github.oshi@6.2.2/oshi.util.Util.freeMemory(Util.java:112)
    at com.github.oshi@6.2.2/oshi.jna.ByRef$CloseableLONGLONGByReference.close(ByRef.java:101)
    at com.github.oshi@6.2.2/oshi.util.platform.windows.PerfDataUtil.updateQueryTimestamp(PerfDataUtil.java:174)
    at com.github.oshi@6.2.2/oshi.util.platform.windows.PerfCounterQueryHandler.updateQuery(PerfCounterQueryHandler.java:134)
    at com.github.oshi@6.2.2/oshi.util.platform.windows.PerfCounterWildcardQuery.queryInstancesAndValuesFromPDH(PerfCounterWildcardQuery.java:164)
    at com.github.oshi@6.2.2/oshi.util.platform.windows.PerfCounterWildcardQuery.queryInstancesAndValues(PerfCounterWildcardQuery.java:87)
    at com.github.oshi@6.2.2/oshi.driver.windows.perfmon.ProcessorInformation.queryProcessorCounters(ProcessorInformation.java:167)
    at com.github.oshi@6.2.2/oshi.hardware.platform.windows.WindowsCentralProcessor.queryProcessorCpuLoadTicks(WindowsCentralProcessor.java:349)
    at com.github.oshi@6.2.2/oshi.util.Memoizer$1.get(Memoizer.java:87)
    at com.github.oshi@6.2.2/oshi.hardware.common.AbstractCentralProcessor.getProcessorCpuLoadTicks(AbstractCentralProcessor.java:204)
    at com.github.oshi@6.2.2/oshi.hardware.platform.windows.WindowsCentralProcessor.querySystemCpuLoadTicks(WindowsCentralProcessor.java:221)
    at com.github.oshi@6.2.2/oshi.util.Memoizer$1.get(Memoizer.java:87)
    at com.github.oshi@6.2.2/oshi.hardware.common.AbstractCentralProcessor.getSystemCpuLoadTicks(AbstractCentralProcessor.java:192)
    at com.github.oshi@6.2.2/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 com.github.oshi@6.2.2/oshi.util.Util.freeMemory(Util.java:112)
        at com.github.oshi@6.2.2/oshi.jna.ByRef$CloseableHANDLEByReference.close(ByRef.java:115)
        at com.github.oshi@6.2.2/oshi.util.platform.windows.PerfCounterQueryHandler.removeAllCounters(PerfCounterQueryHandler.java:112)
        at com.github.oshi@6.2.2/oshi.util.platform.windows.PerfCounterQueryHandler.close(PerfCounterQueryHandler.java:166)
        at com.github.oshi@6.2.2/oshi.util.platform.windows.PerfCounterWildcardQuery.queryInstancesAndValuesFromPDH(PerfCounterWildcardQuery.java:146)
        ... 10 more

推荐答案

Oshi 6.2.2需要JNA(Java Native Access)5.12.1,但看起来类路径上有一个旧版本的JNA.JNA 5.12.0中引入了Memory.close()方法.

判断为net.java.dev.jna:jnanet.java.dev.jna:jna-platform引入的依赖项为mvn dependency:tree,并在您自己的POM中添加显式依赖项(在dependencyManagement中),或者将其从引入旧版本的库中排除,这样就可以引入OSHI定义的版本.

Java相关问答推荐

当耗时的代码完成时,Circular ProgressIndicator显示得太晚

Java 21虚拟线程会解决转向react 式单线程框架的主要原因吗?

转换为Biggram

@从类文件中删除JsonProperty—Java

S的字符串表示是双重精确的吗?

这是什么Java构造`(InputStream Is)->;()->;{}`

在Spring Boot中使用哪个Java类来存储创建时间戳?

第三方Jar pom.xml

Arrays.hashcode(int[])为不同的元素提供相同的散列

Jolt变换JSON数组问题

try 在Android Studio中的infoWindow中使用EditText(Java)

如何在透视表中添加对计数列的筛选?

AbstractList保证溢出到其他方法

插入中的JOOQ序列,设置为VS值

组合连接以从两个表返回数据

在Spring Boot中使用咖啡因进行缓存-根据输出控制缓存

MapStruct记录到记录的映射不起作用

在JPanel上使用GridBagLayout并将JButton放在里面时出现问题

睡眠在 Spring Boot 中

移动二维数组的行