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

背景

在集成海康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.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

考虑数据库粒度的设计-提升效率

目录 概要 场景 设计思路 小结 概要 公开的资料显示,数据库粒度是:“在数据库领域,特别是数据仓库的设计中,粒度是一个核心概念,它直接影响到数据分析的准确性和存储效率。粒度的设定涉及到数据的详细程度和精度&…

CH11_JS的多重循环

第11章:Javascript的多重循环 本章目标 掌握二重循环的使用 掌握二重循环的控制语句的使用 课程回顾 循环控制有那几种方式 讲解内容 1. 回顾练习 需求说明 某次程序大赛,AI2101班有4名学员参加,学员的成绩由用户输入,计算…

文件系统技术架构分析

一文读懂:什么是文件系统 ,有哪几类? ▉ 什么是文件系统? 技术大拿眉头皱了皱,忍住快要爆发的情绪。解释到: 数据以二进制形式存储于介质,但高低电平含义难解。文件系统揭秘这些二进制背后的意…

【踩坑】修复pyinstaller报错 No module named pkg_resources.extern

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 报错如下: 修复方法: pip install --upgrade setuptools pippyinstaller -F -w main.py --hidden-importpkg_resources.py2_wa…

前端位置布局汇总

HTML中脱离文档流的元素有: position: absolute - 元素相对于最近的已定位(非 static)祖先元素定位。 position: fixed - 元素相对于浏览器窗口定位。 float: left 或 float: right - 元素向左或向右浮动,周围的内容会环绕它。 …

认识流式处理框架Apache Flink

目录 一、Apache Flink 的基础概念 1.1 Apache Flink是什么? 1.2 Flink的定义 二、Apache Flink 的发展史 2.1 Flink前身Stratosphere 2.2 Flink发展时间线及重大变更 三、Flink核心特性 3.1 批流一体化 3.2 同时支持高吞吐、低延迟、高性能 3.3 支持事件时…

探索Linux:开源世界的无限可能

Linux是一款开源操作系统,它的起源可以追溯到上世纪90年代初。这个故事始于一个名叫Linus Torvalds的芬兰大学生,他在1983年开始编写一个用于个人电脑的操作系统内核。在他的努力下,Linux逐渐发展成为一个稳定而强大的操作系统。 然而&#…

分数的表示和运算方法fractions.Fraction()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 分数的表示和运算方法 fractions.Fraction() 选择题 以下代码三次输出的结果分别是? from fractions import Fraction a Fraction(1, 4) print(【显示】a ,a) b Fraction(1, 2…

网络基础:BGP协议

BGP(边界网关协议,Border Gateway Protocol)是一种用于在不同自治系统(Autonomous Systems,AS)之间交换路由信息的路径向量协议。BGP是互联网的核心路由协议之一,负责管理和维护互联网范围内的路…

为企业知识库选模型?全球AI大模型知识库RAG场景基准测试排名

大语言模型常见基准测试 大家对于AI模型理解和推理能力的的基准测试一定非常熟悉了,比如MMLU(大规模多任务语言理解)、GPQA(研究生级别知识问答)、GSMSK(研究生数学知识考察)、MATH&#xff08…

WordPress作品设计素材图片站资讯文章教程uigreat主题

主题介绍 uigreat主题是一款wordpress作品主题,发布设计作品素材文章,适合作品展示、设计等站点使用等,这款主题都非常合适。 1、自适应设计,PC、平板、手机等均可正常浏览; 2、图片缩略图可自定义高度,主…

摸鱼大数据——Spark SQL——DataFrame详解一

1.DataFrame基本介绍 DataFrame表示的是一个二维的表。二维表,必然存在行、列等表结构描述信息​表结构描述信息(元数据Schema): StructType对象字段: StructField对象,可以描述字段名称、字段数据类型、是否可以为空行: Row对象列: Column对象&#xff…

服务器BMC基础知识总结

前言 因为对硬件方面不太理解,所以打算先从服务器开始学习,也想和大家一起分享一下,有什么不对的地方可以纠正一下哦!谢谢啦!互相学习共同成长~ 1.BMC是什么? 官方解释:BMC全名Baseboard Mana…

【聚星文社 绘唐3】MJ版一键AI工具使用文档

MJ版一键AI工具使用文档 绘唐地址下载 欢迎使用MJ版一键AI工具!这个工具可以帮助您快速生成各种类型的文本,包括文章、对话、代码等等。 使用方法: 登录:首先,您需要登录到您的MJ版账户。如果您还没有账户&#xff0…

Spring AOP源码篇二之 代理工厂ProxyFactory学习

了解AspectJ表达式以及PointCut、Advice、Advisor后,继续学习Spring AOP代理工厂 AspectJ表达式参考:Spring AOP之AspectJ表达式-CSDN博客 PointCut、Advice、Advisor参考:Spring AOP源码篇一之 PointCut、Advice、Advisor学习-CSDN博客 简单…

从零开始实现大语言模型(四):简单自注意力机制

1. 前言 理解大语言模型结构的关键在于理解自注意力机制(self-attention)。自注意力机制可以判断输入文本序列中各个token与序列中所有token之间的相关性,并生成包含这种相关性信息的context向量。 本文介绍一种不包含训练参数的简化版自注意力机制——简单自注意…

STM32-PWR和WDG看门狗

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. PWR1.1 PWR简介1.2 电源框图1.3 上电复位和掉电复位1.4 可编程电压监测器1.5 低功耗模式1.6 模式选择1.7 睡眠模式1.8 停止模式1.9 待机模式1.10 库函数 2. WDG看门狗2.1 WDG简介2.2 IWDG框图2.3 IWDG键寄存器2.4 …

ACM ICPS独立出版 | 2024年第三届计算与人工智能国际会议(ISCAI 2024)

会议简介 Brief Introduction 2024年第三届计算与人工智能国际会议(ISCAI 2024) 会议时间:2024年11月22 -24日 召开地点:中国大理 大会官网:www.iscai.org 2024年第三届计算与人工智能国际会议(ISCAI 2024)将围绕“计算与人工智能”的最新研究…

排序 -- 冒泡排序和快速排序

一、 交换排序 1、基本思想 所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。 2、常见的交换排序 1、冒泡…

Java Selenium入门程序

需求:使用chrome浏览器打开百度首页 1.配置浏览器驱动 (1)下载浏览器驱动,浏览器版本需与驱动版本一致; (2)编辑系统环境变量-->编辑Path-->填入浏览器驱动路径: 2.maven工…