写在前边

这阵子有点忙,开发一个微服务项目中读取配置文件的时候在本地测试是可以的,但是一到测试环境就报错,经查看发现是因为发布的时候是用的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包后测试报错的可能原因的更多相关文章

  1. 打成Jar包后运行报错 Unable to locate Spring NamespaceHandler for XML schema namespace

    MAVEN项目,在IDEA中运行正常,但是把它打成jar包后再运行就会出现异常:   Exception in thread "main" org.springframework. ...

  2. 配置完xadmin源码包后启动报错“ Apps aren't loaded yet.”

    raise AppRegistryNotReady("Apps aren't loaded yet.") django.core.exceptions. 碰到这种情况就要查看下是否 ...

  3. 【报错】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 ...

  4. myeclipse打war包时,报错security alert integrity check error

    今天在用myeclipse打包项目时,出现如下图的提示: 在网上查找了一下原因,主要是由于Jar包不符合所导致的.解决办法如下: 将com.genuitec.eclipse.export.wizard ...

  5. maven引入dubbo包后启动报错

    启动后报错内容为: Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exce ...

  6. maven项目打包分析及打包后war包缺少配置文件报错的原因分析,使用progard混淆时配置分析

    1.maven打包: 一直以来我都没太注意过在myeclipse下使用run as来clean居然对项目的target目录没有进行操作,要让操作有效,需要进入到maven build...选项下,进行 ...

  7. JAVA 实现将多目录多层级文件打成ZIP包后保留层级目录下载 ZIP压缩 下载

    将文件夹保留目录打包为 ZIP 压缩包并下载 上周做了一个需求,要求将数据库保存的 html 界面取出后将服务器下的css和js文件一起打包压缩为ZIP文件,返回给前台:在数据库中保存的是html标签 ...

  8. 关于传统项目打成war包的的分析

    技术在不断的革新,以前的项目没有jar管理工具时,都是手动将依赖的jar拷贝到项目之下,然后Build Path,之后Maven出现了,出现了jar包中央仓库,所有的jar包资源集中在这里,免去频繁去 ...

  9. springboot打成war包找不到文件

    项目在eclipse运行是可以的,但是打成war包到线上报错: FileNotFoundException: class path resource [static/apiclient_cert.p1 ...

随机推荐

  1. Jenkins+Maven+SVN+Nexus自动化部署代码实例

    本文接着上篇安装jenkins,安装相关插件,使用我们公司持续集成的测试环境实例进行演示 ========= 完美的分割线 ========== 1.安装jenkins的maven插件 如果要使用je ...

  2. linux一切皆文件之tcp socket描述符(三)

    一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 二.环境准备 ...

  3. Linux内核分析——第四周学习笔记20135308

    第四周 扒开系统调用的“三层皮” 一.内核.用户态和中断 (一)如何区分用户态.内核态 1.一般现在的CPU有几种不同的指令执行级别 ①在高级别的状态下,代码可以执行特权指令,访问任意的物理地址,这种 ...

  4. c语言四则运算

    #include<stdio.h>#define W 5main(){ int a,b,i=0,c,d,r=0; while(i<W) { i++; srand(time()); a ...

  5. PAT 甲级 1021 Deepest Root

    https://pintia.cn/problem-sets/994805342720868352/problems/994805482919673856 A graph which is conne ...

  6. [转帖]SAP MES生产执行系统解决方案

    一.SAP MES概述: SAP公司成立于1972年,总部位于德国,是全球最大的企业管理和协同化商务解决方案供应商.全球第三大独立软件供应商.目前,在全球有120多个国家的超过86,000多家用户正在 ...

  7. day8——ajax传参到action(Struts2)

    第一种:url+?+参数 jsp中: $(function(){ $("[name='delemp']").click(function(){ $this = $(this); $ ...

  8. java之常量折叠

    为什么会写着篇博客,因为昨天看了关于final关键字的解析.但是有个问题始终没有得到解决,于是请教了我qq上之前添加的知乎大神.他给我回复的第一条消息:常量折叠.身为渣渣猿的我立马查询了这个概念.这是 ...

  9. sessionStorage & string typeof

    sessionStorage & string typeof

  10. Ubuntu17安装MySql5.7

    安装: sudo apt-get update sudo apt-get install mysql-server 配置远程访问: vi /etc/mysql/mysql.conf.d/mysqld. ...