对接海康sdk-linux下复制jar包中resource目录的文件夹

news2025/2/25 1:57:34

背景

在集成海康sdk时,需要将一些组件放到项目中作为静态资源,并且海康的sdk初始化也需要加载这些静态资源,在windows下,使用一些File路径的方式是可以正确加载的,但是在linux上就会加载失败。
首先我是将海康的sdk组件放到resource下的,并且按照windows和linux设置了两个文件夹,打成jar包后,在linux上会出现访问不了资源的情况。

项目结构

在这里插入图片描述

在这里插入图片描述

linux上加载失败原因

打成jar包后,jar包就相当于一个压缩包,此时无法获取resource目录下的文件路径。

解决方案

将lib/linux下整个文件全部复制到当前项目的目录下,就相当于放在了与jar包平级的目录下,例如jar包路径:/opt/a/xx.jar,那复制会组件库的位置就在/opt/a,这时应用只需要读取新的组件库位置,就能正确加载组件库了。

处理

核心处理:

  1. 使用ResourcePatternResolver类,可以获取resource下符合条件的所有资源名
  2. 获取的Resource对象,是没有方法可以判断到底是文件夹还是文件的,这里我通过实验发现一个可行办法。。。如果是文件夹,那么resource.getFilename()是一定为空的,因为文件夹其实并不算一个资源,
  3. 写文件时必须使用流,不能用File对象

结果

以下是处理resource目录下文件夹或文件复制的工具类

package com.lezhi.szxy.hkEducation.util;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import java.io.*;
import java.util.Arrays;
import java.util.stream.Collectors;

/**
 * @author:hahaha
 * @creattime:2021-12-02 10:33
 */

@Slf4j
public class ResourceFileUtil {
   

    /**
     * 复制resource下指定文件夹内所有的文件至目标目录,包括子文件夹
     * @param sourcePath  classpath文件路径,例如 static/hk
     * @param newPath 目标目录
     */
    public static void copyFolderFromResource(String sourcePath, String newPath) throws IOException {
   
        log.info("源文件夹:{}, 目标文件夹:{}", sourcePath, newPath);
        if (!FileUtil.exist(newPath)) {
   
            FileUtil.mkdir(newPath);
        }
        // 注意:一定要使用/**,获取所有匹配的文件,包括子文件夹及其下的文件
        // /* 只能获取该目录下的一级目录下的文件,无法继续下转获取子文件夹的文件,并且/* 无法获取子文件夹,这里说的是文件夹哈,即连Resource对象都不会存在
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext();
        Resource[] resources = context.getResources(sourcePath + File.separator  + "**");
        // 在linux下运行时,resource必须是ClassPathResource类型,其打印的Description格式为 class path resource [lib/linux/HCNetSDKCom/],可通过日志查看是否加载正确,如果不正确,说明项目结构有问题,无法识别classpath
        // 在windows下运行时,resource有可能是FileSystemResource类型,其打印的Description格式为 file [xxxx]
        log.info("sourcePath 下的资源列表:{}", Arrays.stream(resources).map(Resource::getDescription).collect(Collectors.toList()));
        Arrays.stream(resources).forEach(resource -> {
   
            try {
   
                // 获取目标文件夹的 下级及子级目录
                String filename = getRealPathFromDesc(resource, sourcePath);
                if (StrUtil.isBlank(filename) || File.separator.equals(filename)) {
   
                    return;
                }
                String destFilePath = newPath + filename;
                // getFilename为空说明是文件夹,ClassPathResource下的文件夹就是空的资源名
                // 如果是文件系统,则直接判断文件是否是文件夹
                if (StrUtil.isBlank(resource.getFilename()) ||
                   (resource instanceof FileSystemResource && resource.getFile().isDirectory())
                ) {
   
                    if (!FileUtil.exist(destFilePath)) {
   
                        new File(destFilePath).mkdirs();
                    }
                    return;
                }

                // 否则是文件资源,则直接写文件
                FileUtil.writeFromStream(resource.getInputStream(), destFilePath);
            } catch (Exception e) {
   
                log.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1902072.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【硬件产品经理】硬件产品手板设计

目录 简介 硬件手板 手板资料 作者简介 简介 今天来聊聊产品手板这个话题。 到了手板这个层面其实就属于产品设计细节了, 无论你对整个开发体系如何如何了解, 对公司管理流程如何如何精通。 最终都是要回归到业务细节中去的, 你可能…

6800和8080单片机读写时序和液晶屏接口

前言: 随着单片机发展,集成度越来越高,因此目前单片机较少使用RD和WR信号操作外设,因此很多时候,变成了6800和8080单片机读写液晶屏了。早期的读写本质上是对一个地址进行即时的操作,现在可能是等数据送到…

信号与系统-实验6-离散时间系统的 Z 域分析

一、实验目的 1、掌握 z 变换及其性质;了解常用序列的 z 变换、逆 z 变换; 2、掌握利用 MATLAB 的符号运算实现 z 变换; 3、掌握利用 MATLAB 绘制离散系统零、极点图的方法; 4、掌握利用 MATLAB 分析离散系统零、极点的方法&a…

Docker部署Seata与Nacos整合

本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Docker部署Seata与Nacos整合 Docker 部署 Seata 与 Nacos 整合 运行所使用的 demo项目地址 …

最近你悟出来什么道理?

点击上方△腾阳 关注 转载请联系授权 大家伙,我是腾阳。 活了近30年的我,终于领悟到,人生的旅途是一场深刻而复杂的自我发现与灵魂成长的壮丽征途。 这不仅仅是对外在世界的探索,更是内心深处的一场革命,是灵魂从懵…

移动应用开发课设——原神小助手文档(1)

2023年末,做的移动应用开发课设,分还算高,项目地址:有帮助的话,点个赞和星呗~ GitHub - blhqwjs/-GenShin_imp: 2023年移动应用开发课设 本文按照毕业论文要求来写,希望对大家有所帮助。 xxxx大学课程设计报…

SpringBoot 生产实践:没有父 starter 的打包问题

文章目录 前言一、搜索引擎二、Chat GPT三、官方文档四、小结推荐阅读 前言 今天刚准备写点文章,需要 SpringBoot 项目来演示效果。一时心血来潮,没有采用传统的方式(即通过引入 spring-boot-starter-parent 父工程的方式)。 &l…

Django学习第六天

启动项目命令 python manage.py runserver 取消模态框功能 js实现列表数据删除 第二种实现思路 使用jquery修改模态框标题 编辑页面拿到数据库数据显示默认数据功能实现 想要去数据库中获取数据时:对象/字典 三种不同的数据类型 使用Ajax传入数据实现表单编辑&…

ContextCapture - 开启三维世界的魔法之门

亲爱的朋友们,当我第一次接触到ContextCapture这款软件时,我的内心激动得难以平静。仿佛一位魔法师突然出现在我面前,向我展示了一个全新的世界。是的,这就是ContextCapture带给我的感觉 - 它不仅仅是一款软件,更是一把…

电机控制杂谈——增量式的预测电流控制的优势在哪?

1.前言 前几天看到这么个问题。“模型预测控制如何消除静态误差” 评论说用增量式的预测控制。 这个回答让我想起来我大四下看的这篇论文。现在都一百多被引用了。 但是苦于当时能力有限,没办法复现这个文章。 所以现在想重新验证一下。 2.静态误差和电机磁链有…

【大数据】—FIFA世界杯探索性分析(EDA)

引言 足球,作为全球最受欢迎的运动之一,拥有庞大的粉丝群体和深远的文化影响。自1930年首届FIFA世界杯举办以来,这项赛事已经成为全球体育盛事,吸引了数十亿观众的目光。世界杯不仅是各国足球技艺的较量,更是国家荣誉…

Linux多进程和多线程(七)进程间通信-信号量

进程间通信之信号量 资源竞争 多个进程竞争同一资源时,会发生资源竞争。 资源竞争会导致进程的执行出现不可预测的结果。 临界资源 不允许同时有多个进程访问的资源, 包括硬件资源 (CPU、内存、存储器以及其他外 围设备) 与软件资源(共享代码段、共享数据结构) …

linux watchdog 子系统

目录 一、watchdog 子系统二、关键数据结构2.1 watchdog_device2.2 watchdog_ops2.3 watchdog_info 三、重要流程3.1 watchdog 初始化3.2 watchdog 设备注册3.3 watchdog 设备文件操作函数3.4 watchdog 喂狗用户空间 watchdog(busybox)内核空间喂狗疑问 …

安装 tesseract

安装 tesseract 1. Ubuntu-24.04 安装 tesseract2. Ubuntu-24.04 安装支持语言3. Windows 安装 tesseract4. Oracle Linux 8 安装 tesseract 1. Ubuntu-24.04 安装 tesseract sudo apt install tesseract-ocr sudo apt install libtesseract-devreference: https://tesseract-…

AI多模态教程:Qwen-VL多模态大模型实践指南

一、模型介绍 Qwen-VL,由阿里云研发的大规模视觉语言模型(Large Vision Language Model, LVLM),代表了人工智能领域的一个重大突破。该模型具有处理和关联图像、文本、检测框等多种类型数据的能力,其输出形式同样多样…

进程控制-fork函数

一个进程,包括代码、数据和分配给进程的资源。 fork ()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同…

3101.力扣每日一题7/6 Java(接近100%解法)

博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 主要是基于对…

WPF中Background=“{x:Null}“ 和 Transparent

WPF中关于背景透明和背景无 此时&#xff0c;我代码中是写的有有个控件&#xff0c;一个Border &#xff0c;一个TextBox &#xff0c;范围都是全屏这么大&#xff0c;可以输入TextBox 因为&#xff0c;当border没有设置背景的时候&#xff0c;实际上是&#xff1a; <Borde…

连锁门店如何快速联网

随着新零售业态的发展&#xff0c;连锁门店的运营模式逐渐转为数字化运营&#xff0c;新增了诸如收银PoS、扫码枪、摄像头等数字化终端。这些数字化的业务应用都需要依托稳定可靠的网络才能正常运转&#xff0c;在这样的背景下&#xff0c;连锁门店对网络连接的需求显得尤为关键…

【HICE】转发服务器实验

1.在本地主机上操作 2.在客户端操作设置主机的IP地址为dns 3.测试,客户机是否能ping通