写在前边

这阵子有点忙,开发一个微服务项目中读取配置文件的时候在本地测试是可以的,但是一到测试环境就报错,经查看发现是因为发布的时候是用的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. ngnix的基本安装及配置 centos7

    1.centos7  挂载ngnix的源 rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7- ...

  2. python 游戏(龙的国度)

    1. 理清楚游戏思路 实现功能:2个洞穴选择,一个洞穴是好龙,一个洞穴是坏龙,坏龙可以概率屠龙或者概率逃跑选项(后续难度需要增加宝藏获取装备,随机遇见商人,随着游戏进度逐步减少屠龙概率) 2. 计数和 ...

  3. Shell 基础 -- 流编辑器 sed 详解

    一.流编辑器 sed 与命令 sed Linux 中,常使用流编辑器 sed 进行文本替换工作.与常使用的交互式编辑器(如vim)不同,sed 编辑器以批处理的方式来编辑文件,这比交互式编辑器快得多, ...

  4. App Inspector 功能详解

    前言: App Inspector:浏览器端的移动设备 UI 查看器,使用树状态结构查看 UI 布局,自动生成 XPaths 官网:https://macacajs.github.io/app-ins ...

  5. PAT甲题题解-1013. Battle Over Cities (25)-求联通分支个数

    题目就是求联通分支个数删除一个点,剩下联通分支个数为cnt,那么需要建立cnt-1边才能把这cnt个联通分支个数求出来怎么求联通分支个数呢可以用并查集,但并查集的话复杂度是O(m*logn*k)我这里 ...

  6. Android的发展历程及搭建

    Android的发展历程: 对于Android我比较不熟悉,因为我的第一只手机就是iphone,我没用过Android系统,但在中国使用带有Android系统的手机的人数是最多的,所以我想学习Andr ...

  7. ctr中的GBDT+LR的优点

    1 为什么gbdt+lr优于gbdt? 其实gbdt+lr类似于做了一个stacking.gbdt+lr模型中,把gbdt的叶子节点作为lr的输入,而gbdt的叶子节点相当于它的输出y',用这个y'作 ...

  8. 爆打团队 四则运算 beta视频

    爆打团队 四则运算 beta视频链接 http://v.youku.com/v_show/id_XMTU1MjAzNDI0NA==.html?from=s1.8-1-1.2

  9. APIO模拟赛(HGOI20180909)

    想法:贪心. A.最大高度大的先剪 首先需要知道: 1.每个草最多剪1次 假设有个草剪了2次,显然可以放到最后一次剪得效果和剪2次的效果一样的, 为了少剪那么草最多剪去一次,从而,步数step> ...

  10. c++函数写的都对,还是说incompatible或者not found的解决办法

    vs2010,c++,定义了一个函数如下,在BianHuanYuDib.h文件中: 在BianHuanYuDib.cpp中: 写的完全正确,但还是会报错: 很明显,连std都报错了,一般不是真的有很大 ...