java - 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-platform 版本。
解决方案
OSHI 网站上有关 JNA 的文档与NoClassDefFoundError
此案例无关,因为未找到 OSHI 本身。问题出在包含堆栈跟踪第一行的包中:
at io.cloudslang.worker.monitor.CpuPerProcess.measure(CpuPerProcess.java:34)
从这个包名称看来,您正在使用CloudSlang score,但是 GitHub 上的最新版本不包括 class CpuPerProcess
。您可能正在使用该存储库的分叉版本。
在这种情况下,您需要确保该oshi-core
依赖项包含在pom.xml
您的 CloudSlang 分叉版本中。
虽然它与您看到的错误并不特别相关,但要回答您关于 JNA 版本的问题是它 JNA 工件作为传递依赖项包含在 OSHI 中。如果您使用 Spring starter parent(而不仅仅是另一个依赖项),则 JNA 的 Spring 版本优先,您必须在您的中定义它pom.xml
以确保 Spring 包含正确的版本:
<properties>
<jna.version>5.6.0</jna.version>
</properties>
推荐阅读
- python - Python 和 pandas 循环无法在 xlsx 中写入行
- javascript - 雪花 SQL + Javascript 可能吗?
- python - argparse 错误: 'nargs 必须是 %r 才能提供 const' % OPTIONAL)
- python - 将默认值 0 设置为 IntegerField 不起作用
- java - 删除旧表并创建新表并预填充它 - RoomDatabase
- django - GitHub Actions 中的 Docker 构建与本地构建具有不同的行为
- python - Celery 调度程序 FIFO 队列
- django - 如何将自定义用户模型迁移到 Django 中的不同应用程序?
- r - levelplot 更新后停止工作:错误消息
- c# - 如何在asp.net的asp标签中显示`&`后跟一个单词`param`?