项目引入非配置的文件,打成war包后测试报错的可能原因
写在前边
这阵子有点忙,开发一个微服务项目中读取配置文件的时候在本地测试是可以的,但是一到测试环境就报错,经查看发现是因为发布的时候是用的war包,使用java -jar xxx.war启动的,所以用当前类名.class.getResource("/路径")的方式拿到的是一个URL,其中,URL里有!,无法成功toURI.
出问题的代码:
static {
//静态加载公私钥到成员变量,减少开流
try {
File privateKeyFile = new File(WebRTCSigApiUtil.class.getResource("/private_key").toURI());
byte[] privateKey = new byte[(int) privateKeyFile.length()];
//读取私钥的内容
FileInputStream in1 = new FileInputStream(privateKeyFile);
in1.read(privateKey);
in1.close();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("WebRTCSigApiUtil初始化出现错误");
}
}
原因分析
其中当前类名.class.getResource("/private_key")获取的是这个文件的URL,File类的构造方法只支持文件全路径或URI,所以我们需要URL转换成URI,这里在打成war包的情况下,转换成URI会报java.lang.IllegalArgumentException: URI is not hierarchical的错误,因为是在静态块中报错,所以会停止继续加载类,Classloader在classpath下可以找到这个类,但是却加载不了,从而抛出java.lang.NoClassDefFoundError:could not initial class xxxxxxxxxxxx的异常
解决办法
这里只提供获取非配置文件中的内容的方法,比如private_key文件,我们的目的是读取出文件中的内容,所以完全可以不用使用File类进行二次包装,我们需要的内容直接从流中就可以获取。
static {
//静态加载公私钥到成员变量,减少开流
String privateKey = "";
try {
Resource privateKeyResource = new ClassPathResource("private_key");
privateKey = new String(FileCopyUtils.copyToByteArray(privateKeyResource.getInputStream()));
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("WebRTCSigApiUtil初始化出现错误");
}
}
//上面代码导入的包
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.util.FileCopyUtils;
这里的private_key文件处于resources下,resources正处于classpath下,打成war之后,这个路径所有classpath路径下的文件都会被复制到class目录下
通过使用Spring的 ClassPathResource 读取出classpath下的文件资源
然后通过资源获取流,使用FileCopyUtils进行转换成byte[],
最后通过String的构造方法将字节数组转成String对象,此时这个 privateKey 中所保存的内容就是文件中的内容了
本文为作者原创文章,未经许可,禁止转载
项目引入非配置的文件,打成war包后测试报错的可能原因的更多相关文章
- 打成Jar包后运行报错 Unable to locate Spring NamespaceHandler for XML schema namespace
MAVEN项目,在IDEA中运行正常,但是把它打成jar包后再运行就会出现异常: Exception in thread "main" org.springframework. ...
- 配置完xadmin源码包后启动报错“ Apps aren't loaded yet.”
raise AppRegistryNotReady("Apps aren't loaded yet.") django.core.exceptions. 碰到这种情况就要查看下是否 ...
- 【报错】spring整合activeMQ,pom.xml文件缺架包,启动报错:Caused by: java.lang.ClassNotFoundException: org.apache.xbean.spring.context.v2.XBeanNamespaceHandler
spring版本:4.3.13 ActiveMq版本:5.15 ======================================================== spring整合act ...
- myeclipse打war包时,报错security alert integrity check error
今天在用myeclipse打包项目时,出现如下图的提示: 在网上查找了一下原因,主要是由于Jar包不符合所导致的.解决办法如下: 将com.genuitec.eclipse.export.wizard ...
- maven引入dubbo包后启动报错
启动后报错内容为: Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exce ...
- maven项目打包分析及打包后war包缺少配置文件报错的原因分析,使用progard混淆时配置分析
1.maven打包: 一直以来我都没太注意过在myeclipse下使用run as来clean居然对项目的target目录没有进行操作,要让操作有效,需要进入到maven build...选项下,进行 ...
- JAVA 实现将多目录多层级文件打成ZIP包后保留层级目录下载 ZIP压缩 下载
将文件夹保留目录打包为 ZIP 压缩包并下载 上周做了一个需求,要求将数据库保存的 html 界面取出后将服务器下的css和js文件一起打包压缩为ZIP文件,返回给前台:在数据库中保存的是html标签 ...
- 关于传统项目打成war包的的分析
技术在不断的革新,以前的项目没有jar管理工具时,都是手动将依赖的jar拷贝到项目之下,然后Build Path,之后Maven出现了,出现了jar包中央仓库,所有的jar包资源集中在这里,免去频繁去 ...
- springboot打成war包找不到文件
项目在eclipse运行是可以的,但是打成war包到线上报错: FileNotFoundException: class path resource [static/apiclient_cert.p1 ...
随机推荐
- numpy 初识(二)
针对 numpy.array(序列)的实例介绍 ndim 数组(矩阵)的维度 size 所有元素的和 数学运算(+, -) 元素个数一样,对应位置相减 加,减,乘,平方一个数,执行广播形式:即都减去一 ...
- UE4添加植被Foliage Type
在UE4中的地形渲染上不可避免的需要添加植被,而如果采取手动添加StaticMesh植被的方式则会浪费大量的时间精力. UE4提供了一种批量添加地面植被类型的方式Foliage Type.在编辑器内容 ...
- LeetCode-765.情侣牵手
N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并肩坐在一起. 一次交换可选择任意两人,让他们站起来交换座位. 人和座位用 0 到 2N-1 的整 ...
- 《Deep Learning》(深度学习)中文版PDF免费下载
<Deep Learning>(深度学习)中文版PDF免费下载 "深度学习"经典著作<Deep Learning>中文版pdf免费下载. <Deep ...
- PowerDesigner数据库设计实用技巧
欢迎大家补充,谢谢! 1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的 ...
- 转载:ArcEngine 唯一值查询
转载 http://virgoooos.iteye.com/blog/512329 转载:http://blog.csdn.net/mydriverc/archive/2007/07/26/17092 ...
- mysql学习(2)-Navicat Premium 12 链接MySQL8.0.11数据库报2059错误
Navicat Premium 12 链接MySQL8.0.11数据库报2059错误 1,问题现象 安装完MySQL8.0.11和Navicat Premium12后,我们会用Navicat去测试连接 ...
- maven util 类 添加 service
直接关键代码: public class DictionaryUtil { // 以下的处理,是为了在工具类中自动注入service // 前提是在applicationContext.xml中,将该 ...
- ElasticSearch 2 (17) - 深入搜索系列之部分匹配
ElasticSearch 2 (17) - 深入搜索系列之部分匹配 摘要 到目前为止,我们介绍的所有查询都是基于完整术语的,为了匹配,最小的单元为单个术语,我们只能查找反向索引中存在的术语. 但是, ...
- PAT 1044 火星数字
https://pintia.cn/problem-sets/994805260223102976/problems/994805279328157696 火星人是以13进制计数的: 地球人的0被火星 ...