当前位置: 首页 > news >正文

根据OS自动加载不同的native库和本地jar包

目录

    • 背景
    • 加载本地jar包
    • 加载native库
    • 打jar包时如何处理native库
    • 根据OS自动选择、或者手动选择加载文件

背景

在SpringBoot项目中调用虹软SDK,来实现人脸、性别检测等功能。且此项目需要部署到不同环境,包括Windows和Linux。以Windows为例,从下图可见,需要加载本地jar包(maven的公开库找不到此依赖),和native库(Windows上为.dll文件,Linux上为.so文件)。
在这里插入图片描述

加载本地jar包

pom.xml中的本地依赖如下。当使用了 system 作用域,Maven 不会尝试从远程仓库下载这个依赖,而是直接使用指定路径的本地文件:

     <dependency>  <!--虹软 人像识别--><groupId>com.arcsoft.face</groupId><artifactId>arcsoft-sdk-face</artifactId><version>3.0.0.0</version><scope>system</scope><systemPath>${pom.basedir}/libs/WIN64/arcsoft-sdk-face-3.0.0.0.jar</systemPath></dependency>

另外注意需要进行以下设置,不然打jar包时,不会包含system作用域的依赖:
在这里插入图片描述

加载native库

可简单通过os.name等系统属性来自动选择不同路径。核心代码:

private static String getLibPath() {  //native库路径String osName = System.getProperty("os.name").toLowerCase();String localPath = System.getProperty("user.dir");String libPath = localPath + File.separator + "libs";if (osName.contains("win")) {libPath += File.separator + "WIN64";} else {libPath += File.separator + "linux";}return libPath;}@PostConstruct
public void init() {faceEngine = new FaceEngine(getLibPath());。。。

从虹软的代码中可以看到,加载native库的底层关键方法是System.load等方法。

打jar包时如何处理native库

处理 native 库(如 DLL 文件) 的几种思路:

  • 方案一:手动复制DLL到JAR外部的指定目录(如应用根目录或系统库路径)

  • 方案二:将dll打进jar包,运行时再提取DLL到临时目录(感觉不如方案三,放弃)

  • 方案三(推荐):使用 Maven 在构建阶段复制 DLL 到外部 lib 目录 。和方案一一样不将native 文件打进jar包,比方案一优秀在复制动作是自动化的。

亲测有效。示例:修改 pom.xml,在<project><build><plugins>标签中加入:

<plugin><artifactId>maven-antrun-plugin</artifactId><executions><execution><id>copy-native-libs</id><phase>process-resources</phase><goals><goal>run</goal></goals><configuration><target><!-- 创建目标目录 --><mkdir dir="${project.build.directory}/libs"/><!-- 复制 WIN64 目录下的内容 --><copy todir="${project.build.directory}/libs/WIN64"><fileset dir="libs/WIN64"/></copy></target></configuration></execution></executions></plugin>

运行mvn pacakge命令后,可以看到target目录下有了复制过来的文件:
在这里插入图片描述
原理(by通义千问):Maven 本身不提供直接复制文件的功能,但可以通过使用 maven-antrun-plugin 插件 来调用 Ant 任务实现文件复制。

根据OS自动选择、或者手动选择加载文件

包括本地jar包和native库。可在pom.xml文件中使用profile标签,亲测有效:
在这里插入图片描述
其中 <activation> <os> <family>windows</family> </os> </activation>表示当操作系统是 Windows 时,此 Profile 将被自动激活。此Profile还配置了要包含的本地依赖,和mvn package时要复制的native库,具体内容都在前面介绍过了。

构建项目时既可以自动激活Profile,也可以直接指定Profile。比如指定ID为win的profile: mvn package -Pwin
在这里插入图片描述

http://www.dtcms.com/a/262816.html

相关文章:

  • Linux驱动学习day11(定时器)
  • 百度文库智能PPT月访问量超3400万,用户规模翻倍增长
  • demo01:基于 SpringMVC 的用户管理系统
  • AlpineLinux安装部署MongoDB
  • Clickhouse源码分析-TTL执行流程
  • 杂谈-架构时代演进
  • C语言常用转换函数实现原理
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | ThemeClock(主题时钟)
  • Windows环境下Docker容器化的安装与设置指南
  • 【第二章:机器学习与神经网络概述】04.回归算法理论与实践 -(1)线性回归模型
  • AWS WebRTC:通过shell分析并发启动master后产生的日志文件
  • 御控助力打造物联网实训室,赋能职业教育高质量发展
  • 大模型-分布式推理简介
  • Linux基础环境开发工具apt、vim和gcc/g++
  • STC8H驱动两相四线步进电机
  • 基于llama-factory+ollama+vllm加速大模型训推生产
  • 大数据(4)-spark
  • Windows 开发环境部署指南:WSL、Docker Desktop、Podman Desktop 部署顺序与存储路径迁移指南
  • STM32-第一节-新建工程,GPIO,点亮LED,蜂鸣器
  • GC3910S:一款高性能双通道直流电机驱动芯片
  • 【Wireshark】高级过滤技巧精讲
  • Chromium 136 编译指南 Ubuntu篇:Python环境与开发工具配置(五)
  • 解决VSCode打开最近项目后终端shell不正常的问题
  • TCP 滑动窗口实现机制
  • 颠覆传统加密:微算法科技创新LSQb算法,提升量子图像处理速度
  • 芯谷科技--150KHz 3A PWM 降压型 DC/DC 转换器D1507
  • 【原创】【5】【视频二创工具发布】基于视觉模型+FFmpeg+MoviePy实现短视频自动化二次编辑+多赛道
  • UE5 一台电脑+双显示器 配置nDisplay裸眼3D效果
  • 【MCP服务】蓝耘元生代 | 蓝耘MCP平台来袭!DeepSeek MCP服务器玩转大模型集成
  • 【启发式算法】Dynamic A*(D*)算法详细介绍(Python)