一、问题背景
(1) sigar的使用
sigar是一个开源的跨平台系统信息收集工具,C语言实现,使用简单。sigar API 依赖本地库文件工作的,内部通过java.library.path
加载本地库文件,每次在新的环境下使用,需要将库文件添加到系统的java.library.path路径下。为了解决这个问题,将本地库文件添加到项目中,通过 java api 读取 sigar 路径,并将路径追加到 java.library.path中。(如果需要实现该功能的可以参考:添加sigar本地库到 java.library.path自定义代码实现)
(2)异常
项目启动后在,调用sigar获取操作系统信息抛出了如下异常
org.hyperic.sigar.SigarException: 项目路径\target\classes\sigar\sigar-amd64-winnt.dll: Can't load this .dll (machine code=0xbd)
on a AMD 64-bit platform
(3)问题查找
maven项目开启了filtering,pom文件配置如下:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
由于项目的maven配置设置了filtering为true,maven打包时会对recourses目录下的所有文件进行filtering处理,resources目录下的二进制文件会被修改,导致打包后无法正常使用。
二、解决办法
在maven resource plugin的配置下添加nonFilteredFileExtensions配置项,添加需要排除的二进制文件扩展名:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>dll</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
...
</plugin>
添加上述配置后maven打包则会阻止对扩展名为上述配置中的文件进行filtering处理。
参考文章:https://maven.apache.org/plugins/maven-resources-plugin/examples/binaries-filtering.html