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

news/2024/10/5 21:59:58/

背景

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

项目结构

在这里插入图片描述

在这里插入图片描述

linux_7">linux上加载失败原因

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

解决方案

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

处理

核心处理:

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

结果

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

java">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.ppmy.cn/news/1473515.html

相关文章

redis-cluster(集群模式搭建)

redis中间件版本: redis-5.0.5环境介绍 这里使用服务器数量3,分别为172.0.0.1,172.0.0.2,172.0.0.3,每台机器redis节点数量2个,共6个redis节点构成redis-cluster模式。编译安装包 在172.0.0.1的机器上进入安装目录 cd …

学习笔记——动态路由——OSPF(邻接/邻居)

十、OSPF的邻接/邻居 1、OSPF路由器之间的关系 (1)基本介绍 在OSPF网络中,为了交换链路状态信息和路由信息,邻居设备之间首先要建立邻接关系,邻居(Neighbors)关系和邻接(Adjacencies)关系是两个不同的概念。 OSPF路由器的两种关系&#x…

招聘一个1-3年经验的Java工程师:企业视角的技能与素质要求

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

使用docfx生成API文档【生成c#帮助文档】

使用docfx生成API文档 docfx https://dotnet.github.io/docfx/ 下载docfx 下载docfx:链接 配置环境变量 这里使用的是windows环境,解压对应文件后,将文件夹路径添加到电脑的Path环境变量中。 配置成功后,启动cmd窗口&#…

学生党蓝牙耳机推荐哪个牌子好?四款学生党蓝牙耳机真香品牌分享

对于追求个性化和实用性的学生群体来说,学生党们在挑选蓝牙耳机时,既要考虑价格因素,又不愿牺牲音质与舒适性,期望在经济实惠与高性能之间找到完美的平衡点,面对市场上众多品牌和型号的蓝牙耳机,学生党蓝牙…

惠海 H6912 升压恒流芯片IC 支持2.6-40V升12V24V36V48V60V100V 10A 摄影灯 太阳能灯 UV灯 杀菌灯

1.产品描述 H6912是一款外围电路简洁的宽调光比升压调光LED恒流驱动器,可适用于2.6-40V输入 电压范围的LED恒流照明领域。H6912可以实现高精度的恒流效果,输出电流恒流精度≤士3%,电压工作范围为2.6-40V.可以轻松满足锂电池及中低压的应用需…

Java面试题: 什么情况下索引会失效

什么情况下索引会失效 通过执行计划EXPLAIN可以判断索引是否失效 如果KEY和KEY_LEN为空代表索引失效 索引失效的原因 违反最左前缀法则: 如果索引多列,查询需要从索引的最左前列开始且不能跳过索引中的列 如果符合最左前缀法则,但跳跃了其中的索引,只有最左侧的索引会生效…

2 极/2 零 (2P2Z) 补偿器

极/2 零 (2P2Z) 补偿器是模拟 II 型控制器的数字实现。它是一种滤波器,通过考虑两个极点和一个零点,将特定的增益和相位升压引入系统。您必须战略性地选择每个极点和零点的频率位置,这将有助于实现所需的系统性能。在该…