发布jar包到服务器读取resource目录下文件
* 解决:当项目打包成jar之后resources路径下面的证书文件访问不到
* 思路:
* 1、运行时先复制一个jar
* 2、将复制的jar解压到jar文件目录
* 3、删除复制的jar跟解压的非证书文件夹
package blockchaincode; import blockchaincode.utils.CryptoUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import blockchaincode.utils.TempCryptoFolderUtil; import com.sunsheen.jfids.das.core.DasApplication;
import com.sunsheen.jfids.das.core.annotation.DasBootApplication; /**
*
* 当独立开发HKDAS应用时(Java工程、Maven工程),使用这种方式启动应用。
* @author WangSong
*
*/ @DasBootApplication()
public class DasApplicationBootstrap {
private static Logger log = LoggerFactory.getLogger(DasApplicationBootstrap.class); public static void main(String[] args) {
//将证书文件拷贝到项目同级目录下
try {
CryptoUtil.pass();
} catch (Exception e) {
e.printStackTrace();
log.error("当前jar包目录の证书文件拷贝异常!", e);
System.err.println("证书文件拷贝异常!");
}
//启动
DasApplication.run(DasApplicationBootstrap.class, args);
} }
package blockchaincode.utils; import java.io.File;
import java.net.URL; import org.apache.derby.impl.tools.sysinfo.Main;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /**
* 解决:当项目打包成jar之后resources路径下面的证书文件访问不到
* 思路:
* 1、运行时先复制一个jar
* 2、将复制的jar解压到jar文件目录
* 3、删除复制的jar跟解压的非证书文件夹
* @author WangSong
*/
public class CryptoUtil {
private static Logger log = LoggerFactory.getLogger(CryptoUtil.class); private CryptoUtil(){} public static void pass()throws Exception{
/** 获取当前jar位置 **/
URL url = Main.class.getClassLoader().getResource("crypto-config/");
//当前需要是个jar文件
String protocol = url.getProtocol();//大概是jar
if (!"jar".equalsIgnoreCase(protocol)) {
log.error("没有以jar运行,不重复生成证书文件。");
return;
}
// jar:file:/home/hkdas-123/HKDAS/app/blockchaincode-provider-1.0.0-jar-with-dependencies.jar!/
String jarPath = url.toString().substring(0, url.toString().indexOf("!/") + 2);
/** 将jar复制一份到当前文件夹 **/
String oldJar = jarPath.substring(jarPath.indexOf("/"),jarPath.lastIndexOf("!/"));
String jarFolder = oldJar.substring(0,oldJar.indexOf("blockchaincode"));
String copiedJar = jarFolder + "copied.jar";
JarUtil.copyJarByJarFile(new File(oldJar), new File(copiedJar));
/** 解压复制的jar文件 **/
JarUtil.unJarByJarFile(new File(copiedJar), new File(jarFolder));
/** 删除--除了证书文件夹和jar文件的所有文件夹 **/
deleteDir(jarFolder);
} //清空文件夹下除了证书文件夹和jar文件的所有文件
private static boolean deleteDir(String path){
File file = new File(path);
if(!file.exists()){//判断是否待删除目录是否存在
// System.err.println("The dir are not exists!");
log.error("The dir are not exists!"+file.getAbsolutePath());
return false;
} String[] content = file.list();//取得当前目录下所有文件和文件夹
for(String name : content){
File temp = new File(path, name);
if(temp.isDirectory()){
//如果是证书文件,不删除
if(name.contains("crypto-config"))
continue; deleteDir(temp.getAbsolutePath());//递归调用,删除目录里的内容
temp.delete();//删除空目录
}else{
//如果是jar包,不删除
if(name.contains(".jar"))
continue;
if(!temp.delete()){//直接删除文件
// System.err.println("Failed to delete " + name);
log.error("Failed to delete " + name);
}
}
}
return true;
}
}
package blockchaincode.utils; import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
import java.util.zip.ZipEntry; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /**
* jar包压缩跟解压工具类
* @author WangSong
*
*/
public class JarUtil {
private static Logger log = LoggerFactory.getLogger(JarUtil.class); private JarUtil(){} /**
* 复制jar by JarFile
* @param src
* @param des
* @throws IOException
*/
public static void copyJarByJarFile(File src , File des) throws IOException{
//重点
JarFile jarFile = new JarFile(src);
Enumeration<JarEntry> jarEntrys = jarFile.entries();
JarOutputStream jarOut = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(des)));
byte[] bytes = new byte[1024]; while(jarEntrys.hasMoreElements()){
JarEntry entryTemp = jarEntrys.nextElement();
jarOut.putNextEntry(entryTemp);
BufferedInputStream in = new BufferedInputStream(jarFile.getInputStream(entryTemp));
int len = in.read(bytes, 0, bytes.length);
while(len != -1){
jarOut.write(bytes, 0, len);
len = in.read(bytes, 0, bytes.length);
}
in.close();
jarOut.closeEntry();
log.error("复制完成: " + entryTemp.getName());
} jarOut.finish();
jarOut.close();
jarFile.close();
} /**
* 解压jar文件by JarFile
* @param src
* @param desDir
* @throws FileNotFoundException
* @throws IOException
*/
public static void unJarByJarFile(File src , File desDir) throws FileNotFoundException, IOException{
JarFile jarFile = new JarFile(src);
Enumeration<JarEntry> jarEntrys = jarFile.entries();
if(!desDir.exists())
desDir.mkdirs(); //建立用户指定存放的目录
byte[] bytes = new byte[1024]; while(jarEntrys.hasMoreElements()){
ZipEntry entryTemp = jarEntrys.nextElement();
File desTemp = new File(desDir.getAbsoluteFile() + File.separator + entryTemp.getName()); if(entryTemp.isDirectory()){ //jar条目是空目录
if(!desTemp.exists())
desTemp.mkdirs();
log.error("makeDir" + entryTemp.getName());
}else{ //jar条目是文件
//因为manifest的Entry是"META-INF/MANIFEST.MF",写出会报"FileNotFoundException"
File desTempParent = desTemp.getParentFile();
if(!desTempParent.exists())desTempParent.mkdirs(); BufferedInputStream in = new BufferedInputStream(jarFile.getInputStream(entryTemp));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(desTemp)); int len = in.read(bytes, 0, bytes.length);
while(len != -1){
out.write(bytes, 0, len);
len = in.read(bytes, 0, bytes.length);
} in.close();
out.flush();
out.close(); log.error("解压完成: " + entryTemp.getName());
}
}
jarFile.close();
} }
发布jar包到服务器读取resource目录下文件的更多相关文章
- IDEA中读取 resource目录下文件
1. 资源文件 2. 加载文件 public void test() { try { System.out.println("begin test"); String filepa ...
- Spring boot 读取resource目录下的文件
背景:最近做项目重构将以前的ssh + angular js架构,重构为spring boot + vue.项目是一个数据管理平台,后台涉及到多表关联查询,数据导入导出等. 问题:读取resource ...
- java读取resource目录下的配置文件
java读取resource目录下的配置文件 1:配置resource目录 下的文件 host: 127.0.0.1 port: 9300 2:读取 / 代表resource目录 InputSt ...
- SpringBoot打成jar包后,获取不到读取resources目录下文件路径的问题
问题描述: Springboot没有打成jar之前,可以成功获取读取resources目录下xxx.json文件的 路径.但是打成jar包后,接口调不通,原因是获取不到文件的路径. 原因: 在本地进行 ...
- maven依赖本地非repository中的jar包-依赖jar包放在WEB-INF/lib等目录下的情况客户端编译出错的处理
MAVEN 今天在使用maven编译打包一个web应用的时候,碰到一个问题: 项目在开发是引入了依赖jar包,放在了WEB-INF/lib目录下,并通过buildpath中将web libariary ...
- 关于Linux上面无法读取资源目录下文件的问题
一开始我的代码是这样子的,读取本地子路径下的json文件 代码运行的时候,在window是可以正常的 @Override public String getBannerStr() { String s ...
- WebApp基础01-设置读取assets目录下文件
要读取assets下的目录,只需要修改三个地方即可 1.res/layout/activity_main.xml 2.AndroidManifest.xml 3.src\com\example\lcy ...
- SAS 读取指定目录下文件列表宏
OPTIONS PS=MAX LS=MAX NOCENTER SASMSTORE=SASUSER MSTORED MAUTOSOURCE;/*获取指定文件夹的指定类型的所有文件*/%MACRO GET ...
- Eclipse 读取config目录下文件
最近在一个项目,在项目下新建了一个config配置文件夹,添加一个配置文件config.properties. 使用classpath:config.properties方式加载配置文件, 具体实现代 ...
随机推荐
- 咕咕咕清单(SCOI2020前)
本篇博客已停更 本篇博客已停更 本篇博客已停更 吐槽区: 2020.04.15: 从今天起我做过的题目都记录一下,想不想写题解就另说了 2020.04.17: 写了两天之后真实的发现这是博主的摸鱼日记 ...
- subprocess.CalledProcessError: Command '['ninja', '-v']' returned non-zero exit status 1.
将anaconda环境下的 lib/python3.5/dist-packages/torch/utils/cpp_extension.py文件 将['ninja','-v']改成['ninja', ...
- mosquitto基于SSL/TLS安全认证测试MQTT
一.环境搭建 1.mosquitto介绍 mosquitto是一个实现了MQTT3.1协议的代理服务器,由MQTT协议创始人之一的Andy Stanford-Clark开发,它为我们提供了非常棒的轻量 ...
- oracle中表加锁死锁的现象、原因及解决方案
一.表加锁.死锁出现的现象 1.对数据库操作update.insert.delete时候,数据库无法更新,操作等待时长,操作结果不发生改变: 2.在程序中,底层(数据访问层)操作时候不成功,数据库连接 ...
- SpringMVC9——异常处理
异常处理 SpringMVC: HandlerExceptionResolver接口 该接口的每个实现类都是异常的一种处理方式: 一.ExceptionHandlerExceptionResolv ...
- 只要动手就能学到东西4 JSON.stringify
今天在调试javascript时,需要将不可显示字符如\r\n在console显示出来,查了下,原来可以用JSON.stringify().这个方法以前也用过,但都是将javascript对象变成js ...
- 基于vue的实时视频流开发
背景:多个实时视频的介入 技术:hls.js的流媒体,支持格式已m3u8为主 解决了什么:多个实时视频长时间播放会有卡顿的情况 具体代码实现: import Hls from 'hls.js' pla ...
- 2.MongoDB 4.2副本集环境基于时间点的恢复
(一)MongoDB恢复概述 对于任何数据库,如果要将数据库恢复到过去的任意时间点,否需要有过去某个时间点的全备+全备之后的重做日志. 接下来根据瑞丽航空的情况进行概述: 全备:每天晚上都会进行备份: ...
- docker入门1-docker container
image和container介绍 一个image是一个可被docker执行的包,它包括程序运行的所有东西,包括代码,运行时,库,环境变量和配置文件. 一个container是image在内存中的运行 ...
- 记一次 gltf 模型的绘制性能提升:从ppt到dove,丝滑感受
转换思路 同样一个模型,分别取如下转换思路: 原始模型fbxgltf 原始模型objgltf 但是我在打开中间格式fbx和obj时,发现这两者虽然顶点数量一致,三角形数量一致,但是使用 Windows ...