微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

oshi-core中SystemInfo类的NoClassDefFoundError

如何解决oshi-core中SystemInfo类的NoClassDefFoundError

我已经使用Maven将oshi-core作为依赖项包含在我的项目中:

依赖关系结构

<dependencies>
    <dependency>
        <groupId>com.github.oshi</groupId>
        <artifactId>oshi-core</artifactId>
       <version>5.2.5</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>score-worker-monitor-api</artifactId>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
    </dependency>
</dependencies>

但是,我看到此错误

2020-10-08 11:15:49,688 [scoreWorkerScheduler-5] (TaskUtils.java:95) ERROR - Unexpected error occurred in scheduled task.
java.lang.NoClassDefFoundError: oshi/SystemInfo
    at io.cloudslang.worker.monitor.cpuPerProcess.measure(cpuPerProcess.java:34)
    at io.cloudslang.worker.monitor.PerfMetricCollectorImpl.collectMetric(PerfMetricCollectorImpl.java:53)
    at io.cloudslang.worker.monitor.service.WorkerMetricCollectorServiceImpl.collectPerfMetrics(WorkerMetricCollectorServiceImpl.java:42)
    at sun.reflect.GeneratedMethodAccessor37.invoke(UnkNown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748) 

我不理解OSHI-GitHub的以下内容。我的意思是在oshi-core中包含依赖项,那为什么还要再次添加jna依赖项?

如果您使用包含JNA作为依赖项的父级(例如Spring Boot),请覆盖jna.version属性或等效项

我在oshi-core依赖项中使用了最新的jna和jna平台版本。

解决方法

OSHI网站上有关JNA NoClassDefFoundError的文档与这种情况无关,因为找不到OSHI本身。问题出在包含堆栈跟踪第一行的软件包中:

at io.cloudslang.worker.monitor.CpuPerProcess.measure(CpuPerProcess.java:34)

它从您正在使用的CloudSlang score软件包名称中出现,但是,GitHub上的最新版本不包含类CpuPerProcess。您可能正在使用该存储库的分支版本。

在这种情况下,您需要确保分支版本的CloudSlang的oshi-core依赖项已包含在pom.xml中。

虽然与您看到的错误没有特别的关系,但要回答有关JNA版本的问题是,它的JNA工件作为传递依赖项包含在OSHI中。如果您使用Spring入门父级(而不只是其他依赖项),那么JNA的Spring版本优先,因此您必须在pom.xml中定义它,以确保Spring包含正确的版本:

<properties>
    <jna.version>5.6.0</jna.version>
</properties>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。