springboot项目在Linux环境下,打出的jar包找不到资源文件的问题总结

Linux环境springboot+maven项目集成sapjco3.jar,sapjco.jar sap由于没有提供maven导致maven项目中无法直接引用,官方只提供了jar包和.so文件,而且限制颇多,不允许对官方提供的jar改名,必须要能加载到.so文件等。所以项目中需要解决springboot+maven项目如何引入sap jar包问题。 阅读详情

今天的开发中遇到的一个问题:

我在resources目录下的templates下建了一个xml文件。

在config类中想读取这个文件, 我使用了如下的代码:

File file = ResourceUtils.getFile("classpath:templates/importEXCEL.xml");

这种代码在windows下是没有问题的,但是一旦打包到了linux环境下,linux系统在jar包路径上多加了!符号,导致程序按这种路径找文件找不到。

改成下面这种写法就可以了:

ClassPathResource classPathResource = new ClassPathResource("templates/importEXCEL.xml");

 

附上xml文件和代码:


import com.techen.tap.exception.BusinessException;
import com.techen.tap.utils.I18nUtil;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @param paraMap
 * @Modify: EXCEL导入模板操作类
 * @author: lihao
 * @date: 2021/5/12 17:33
 * @return ResponseResult<Object>
 */
@Configuration
@Component
public class EXCELConfig {

    //    @Value("${excel.xmlPath}")
//    static String xmlPath;
    final static String EXAMPLE = "example";
    final static String DEFAULT = "default";

    Document document;

    public EXCELConfig() throws FileNotFoundException, DocumentException {
        ClassPathResource classPathResource = new ClassPathResource("templates/importEXCEL.xml");
//        File file = ResourceUtils.getFile("classpath:templates/importEXCEL.xml");
//        File file = ResourceUtils.getFile(xmlPath);
//        InputStream in = new FileInputStream(file);
        InputStream in = null;
        try {
            in = classPathResource.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        SAXReader reader = new SAXReader();
        document = reader.read(in);
    }

    /**
     * @param paraMap
     * @return ResponseResult<Object>
     * @Modify: 获取模板配置中的所有模板名称
     * @author: lihao
     * @date: 2021/5/15 13:55
     */
    public StringBuffer getAllExcelModelName() {
        StringBuffer result = new StringBuffer();
        // 获取xml文档根节点
        Element root = document.getRootElement();
        List<Element> listElement = root.elements();
        for (int i = 0; i < listElement.size(); i++) {
            String elementName = listElement.get(i).getName();
            result.append(elementName);
        }
        return result;
    }

    /**
     * @param paraMap
     * @return ResponseResult<Object>
     * @Modify: 按模版名称获取模版的excel文件
     * @author: lihao
     * @date: 2021/5/15 14:12
     */
    public byte[] getExcelModelByName(String modelName) throws IOException {
        // 获取xml文档根节点
        Element root = document.getRootElement();
        Element element = root.element(modelName);
        if (element == null) {
            return null;
        }
        //构造excel文件
        HSSFWorkbook excel = new HSSFWorkbook();
        HSSFSheet sheet0 = excel.createSheet(element.getName());
        HSSFRow rowNameExcel = sheet0.createRow(0);
        HSSFRow rowDataExcel = sheet0.createRow(1);
        List<Element> colList = element.elements();
        for (int i = 0; i < colList.size(); i++) {
            String data = colList.get(i).getData().toString();
            // 标头
            HSSFCell cellExcel = rowNameExcel.createCell(i);
            cellExcel.setCellValue(data);
            // 示例内容
            HSSFCell cellExample = rowDataExcel.createCell(i);
            Attribute attribute = colList.get(i).attribute(EXAMPLE);
            if (attribute != null) {
                cellExample.setCellValue(attribute.getValue());
            }
        }
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        excel.write(bos);
        byte[] brray = bos.toByteArray();
        return brray;
    }

    /**
     * @param paraMap
     * @return ResponseResult<Object>
     * @Modify: excel转换为map
     * 将要导入的excel表格信息转换为map格式
     * @author: lihao
     * @date: 2021/5/22 11:47
     */
    public List<Map> exacleToMap(MultipartFile file, String modelName) {
        HSSFWorkbook excel = null;
        HSSFSheet sheet = null;
        HSSFRow row = null;
        List<Map> resultMap = new ArrayList<>();

        //构造excel文件
        try {
            excel = new HSSFWorkbook(new POIFSFileSystem(file.getInputStream()));
        } catch (IOException e) {
            throw new BusinessException(I18nUtil.getMessageDefault("file.InvalidFormat", "文件格式错误,请重试"));
        }

        // 获取指定名称的节点
        Element root = document.getRootElement();
        Element elementModel = root.element(modelName);
        List<Element> elements = elementModel.elements();

        if (excel != null) {
            for (int i = 0; i < excel.getNumberOfSheets(); i++) {
                sheet = excel.getSheetAt(i);
                // 从索引为1的行开始获取
                for (int r = 1; r < sheet.getPhysicalNumberOfRows(); r++) {
                    row = sheet.getRow(r);
                    for (int c = 0; c < row.getPhysicalNumberOfCells(); c++) {
                        Map map = new HashMap();
                        String key = elements.get(c).getName();
                        map.put(key, row.getCell(c));
                        resultMap.add(map);
                    }
                }
            }
        }
        System.out.print(resultMap.toString());
        return resultMap;
    }
}

xml文件代码:

<root>
    <ConsAccount>
        <cons_name default="1" example="张三">用户名称</cons_name>
        <cons_addr default="1" example="省市区">用户地址</cons_addr>
        <identity_card default="1" example="XXX">身份证号</identity_card>
        <cons_tel default="1" example="XXX">电话号码</cons_tel>
        <contact_name default="1" example="张三">联系人</contact_name>
        <postal_code default="1" example="05321">邮政编码</postal_code>
        <cons_email default="1" example="xxx@qq.com">电子邮件</cons_email>
        <inuse_num default="1" example="3">使用人口</inuse_num>
        <living_area default="1" example="108">居住面积</living_area>
        <msg_mobile default="1" example="XXX">短信提醒号码</msg_mobile>
    </ConsAccount>
    <Meter>
        <install_addr default="1" example="xxx">安装地址</install_addr>
        <comm_module_addr default="1" example="xxx">模块地址</comm_module_addr>
        <asset_no default="1" example="xxx">资产号</asset_no>
        <run_status_code default="01" example="xxx">运行状态</run_status_code>
        <flag_total default="0" example="xxx">总分类型</flag_total>
        <flag_download default="1" example="xxx">档案上云状态</flag_download>
        <R_val default="1" example="78">R值</R_val>
        <thermal_adapt default="1" example="34℃~67℃">温度自适应性</thermal_adapt>
    </Meter>
</root>

 

SpringBoot项目部署(jar包)——项目用maven打包成jar包 & windows + Linux平台运行 & Linux安装java & 遇到的问题 1.maven打包springboot项目,jar包;2.windows安装java环境,以及运行jar包;3.Linux安装java环境,以及运行jar包;4.运行jar包template might not exist报错及解决; 阅读详情

相关推荐

从零到一:Ollama工具在RK3588上的深度优化实践

本文详细介绍了如何在RK3588开发板上深度优化Ollama工具,以高效运行DeepSeek模型。通过CPU与NPU负载平衡、模型量化、温度控制等策略,显著提升性能并降低功耗,适用于边缘计算场景。文章提供了具体的配置命令和优化方案,帮助开发者充分发挥RK3588的硬件潜力。

rgv23456789的博客 310

Springboot打包jar部署到linux服务器读取resource资源

String path ="puzzle/source"+i+".jpg"; //拼图原图 InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(path); Image bi = ImageIO.read(inputStream);

Amelia_Liu的博客 461

状态转移矩阵在离散控制系统中的应用与实现步骤详解

本文深入解析了状态转移矩阵在离散控制系统中的核心作用与实现步骤。通过一个具体实例,详细演示了如何将连续状态空间模型精确离散化,计算出离散系统矩阵A_d和B_d,并分享了采样周期选择、数值计算技巧及嵌入式C语言实现等关键工程经验,为开发高性能数字控制器提供实用指南。

weixin_28454475的博客 378

Linux服务器上运行找不到jar包中配置文件

例如获取配置文件下JDBC连接参数。本地和linux服务器环境都能找到配置文件。本地测试能跑通,打完jar包后部署到生产环境,报错找不到xxx.xxx配置文件。

Ordydd的博客 1201

Linux内核4.14版本——drm框架分析(1)——drm简介

drm框架分析

yangguoyu8023的博客 1万+

【通俗易懂】Windows系统安装TensorRT

NVIDIA TensorRT是一个由NVIDIA公司开发的用于深度学习推理的高性能SDK。它专门设计用于在NVIDIA GPU上进行高效的神经网络推理,能够大幅度提升深度学习模型的推理速度和效率。TensorRT的主要特点包括:模型优化:TensorRT通过层融合、精度校准、动态形状等技术优化模型,减少推理时的计算量和内存占用。多精度推理:支持多种精度推理,包括FP32、FP16、INT8等,以平衡性能和精度。

王尼莫的博客 1586

linux jar 资源文件,springboot jar 部署到linux之后 获取类资源文件问题-- 仅限linux 下 情况比较特殊 需要获取打到jar内的 讲台资源 只...

https://blog.youkuaiyun.com/qq_27000425/article/details/72897282ClassPathResource类,如果没有指定相对的类名,该类将从类的根路径开始寻找某个resource,如果指定了相对的类名,则根据指定类的相对路径来查找某个resource。Resource rs = new ClassPathResource("onlyfun/caterp...

weixin_29696567的博客 321

跨厂商网络设备的RADIUS认证:Windows NPS的兼容性与最佳实践

本文详细探讨了Windows NPS在多厂商网络环境中的RADIUS认证实践,特别针对华为、华三、思科等主流设备的兼容性问题提供解决方案。从基础配置到高级优化,涵盖VSA属性映射、认证协议选择及安全加固措施,帮助企业实现统一身份认证并提升网络安全性。

weixin_29213827的博客 420

jar在linux上无法读取resources下的文件夹的文件

当时的一个项目 需要读取resources下的文件夹和里面的文件,windows没啥问题,但是linux就是不行 当时用的是 String path = LastdataBusiness.class.getClassLoader().getResource(file).getPath(); String str = readJsonFile.myReadJsonFile(path); 在ide中运行没问题,jar就不行了 因为打包之后他会以绝对路径去找文件 无法找到jar中的文件

王洪展的博客 2664

使用buildroot系统的qmake编译QT出现Unknown module(s) in QT: xxxx 的错误解决方法

可以看到,我这里使用的是 qt5base-5.15.2 目录下的qmake,这个qmake只包含了基础的qt模块,而额外添加的qt模块没有包含进去,需要使用。可以看到我这里是有的,如果你跟我一样,模块存在,但是还是报找不到对应模块的错误的话,大概率是跟我一样,用错qmake了,看第二点。在包含 qt5base 目录下查看,是否有对应模块的目录,如果没有的话,需要通过make menuconfig 添加一下。目录下的qmake才可以。

T541132的博客 2489

【异常】解决 Cursor 报错 Unexpected seqno: 2 != 1. Please try again, or contact support if the issue 的排坑指南

在使用 Cursor 辅助编程时,你是否遇到过 AI 突然中断输出,并在右下角弹出一个红色的 Network Error 弹窗?今天我们就来彻底解析并解决这个网络断连问题。

奶爸的编程之路,也就一周冷个三天 2466

SpringBoot项目打包部署Linux后访问不到resources下的文件

而对于 Class.getResource(String path)来说,可以加"/"开头,也可以不加"/"开头,它底层还是调到Class.getClassLoader().getResource(String path)去,但如果path不加"/",例如"static/img/template.png",则代表是相对路径,表示相对于当前运行这行代码的类,此时会加上 包名+static/img/template.png。结果打印出来了,并且可以看到有报错信息,就是开头所说的问题。也行,也可以正常运行。

gorgor在码农 3415

【电子通识】TINA-TI怎么使用受控源向导创建受控源

TINA-TI怎么使用受控源向导创建受控源

一点硬件 357

SpringBoot 项目部署到服务器上(Jar包)

1. 部署方式 Springboot 和普通web 应用程序不一样,其本质上是一个 Java 应用程序,那么又如何部署呢? 通常来说,Springboot 部署会采用两种方式:全部打包成一个jar,或者打包成一个war。现在讲一下打包成 jar 部署。 2. 打包成 jar 第一种方法(idea) 1. clean 2. package 第二种方法(命令行): ...

雨落本无晴 11万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Linux环境启动、停止与重启springboot(jar包)项目实例

目录一、环境配置(以下是lz的环境配置位置)二、linux环境中springboot加载jar包的三种方式三、项目启动与停止操作第一种方式(java -jar命令方式)四、项目启动与停止操作第二种方式(shell脚本方式) 一、环境配置(以下是lz的环境配置位置) /home/java/目录:jdk1.80安装位置 /usr/local/jar/目录:项目jar包位置 /usr/local/jar/log/目录:日志文件的位置 /usr/local/jar/batchCommands/

小志的博客 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

1秒将本地SpringBoot项目jar包部署到Linux环境(看这一篇就够了)

一键将本地已经打包好的SpringBoot项目部署到linux环境,实现秒级部署 迭代步骤: 1. 在windows环境使用命令启动SpringBoot项目 2. 在Linux环境使用命令启动项目 3. 在Linux环境使用脚本启动项目 4. 优化脚本,每次启动时先关闭旧项目 5. 分离依赖,每次上传Linux环境只上传几百k的代码包 6. 搭配IDEA插件,实现在IDEA中一键部署启动

Java全栈开发者 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Linux 部署Java项目-jar包和war包(五)

本文章是讲述Linux部署Java项目。部署之前先说下两种包,java项目部署到服务器一般有用war包的,也有用jar包的,微服务spring-cloud普及后大部分打包都是jar,部署之前先搞清楚自己要打war包还是jar包,下面小介绍两种包的区别: spring boot既可以打成war发布,也可以打成jar包发布。

y2020520的博客 9960

在Linux环境下部署springboot项目

在Linux环境下部署springboot项目

m0_49527007的博客 1万+

linux获取不到jar的资源路径,SpringBoot打jar包或war包获取不到资源文件解决办法

问题描述在开发过程中我们经常会碰到要在代码中获取资源文件的情况,而我在最近将原有的Tomcat的原生项目迁移到SpringBoot项目中时碰到一个问题,就是在本地运行时,获取本地的xml资源文件是能够获取到的,但是项目打成war包然后将其部署到Tomcat中运行时,就会发生问题,报找不到资源文件的错误。然后经过寻找排查确定了是下面代码通过ClassLoader获取路径的时候出错了。ExcelXml...

weixin_30789921的博客 1791

Linux环境下运行springboot程序(jar包)

在运行springboot程序之前,要确保如下软件已经安装,以保证运行环境有效。

m0_61104769的博客 4986

项目jar部署到linux服务器上

将spring boot项目打包成jar部署到linux上就可以通过ip地址访问该项目 一.将项目打包成jar(IDEA) 由于项目要设置访问端口号,这里来说一下spring boot项目怎么设置端口号 如图所示: 在application.properties这个文件中加入(端口多少由你自己设置,笔者的是8203) #设置端口号 server.port = 8203 二、打包的一个难题(笔者...

寂寞风中一匹狼的博客 3万+

SpringBoot maven项目打jar包并部署到 linux/windows服务

转自http://www.kongzid.com/archives/java3 ,使用Spring自带的DriverManagerDataSource <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" <!—设定dataSourceà <!—使用

孔子说 4074

springboot加载本地jar包并部署在linux环境

springboot加载本地jar包并部署在linux环境 记录一下,springboot加载本地jar包,并部署在linux环境下运行,浪费了好长时间,用了很多方法,终于解决了。 解决办法 1:先将需要加载的jar包放到项目中(我放在了根目录下的lib中,其他位置没有试过,应该也是可以的) 2:加入pom依赖(每个标签的意思自己查一下吧,一个都不能少) 3:在pom文件的build中加入以下配置 4:最后在Libraries中添加所需的本地jar包(jar文件夹即可) 如果有不同意见可以留言。。。

Strong_Foo的博客 2434

Linux 下部署springboot项目 war包和jar包 (超详细教程)

最近需要在Linux 上部署javaweb 项目,javaweb 项目可以自己打包成war包,或者jar 包部署,下面说一下2种包的部署方式。 目录部署war 包一:将springboot项目打包成war包排除内置tomcat添加servlet-api的依赖配置打包类型在启动类继承SpringBootServletInitializer,重载configure方法war打包二:打开宝塔面板,部署war 包把war包上传到 webapp目录下添加网站开启 tomcat 服务部署jar 包 部署war 包 一:

言小溪 的博客 4597

Linux手动启动springboot项目jar包命令详解

1、序言 相信很多朋友都在Linux服务器上都手动启动过springboot项目,对于java -jar都有一定的了解。这次我们专门就Java -jar相关命令做一个详细的理解。 2、Linux运行jar包方式 (1)、java -jar webshop-0.0.1-SNAPSHOT.jar 最简单的jar包运行命令 特点是:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗...

pyf1903047190的博客 4257

SpringBoot以Jar包部署Linux后访问不到jar包外部的资源

由于项目涉及到了大量图片资源,即图片上传功能,总不能上传图片至Jar包内部吧,所以需要在jar包外设置资源路径来保存图片及其他资源。 对于其他框架我们一般使用war包部署到tomcat下,很方便就可以设置资源路径。 而SpringBoot项目自身集成tomcat,如果你真的向我一样作????,咱就想使用Jar包部署那就需要进行一些小小的配置。 其实也无非就是添加一个静态资源映射addResourceHandlers,新建一个类继承自WebMvcConfigurer 需要注意的是: Window上

拾贰S 2081
上一篇: docker 安装rabbitmq
下一篇: 一次性解决xls 格式文件导入问题,区别对待-XSSFWorkbook 和 HSSFWorkbook
libingbojava
博客等级 码龄9年 64粉丝 111原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值