发布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方式加载配置文件, 具体实现代 ...
随机推荐
- 了解学习 Javascript, ES5 和 ES6之间的亲密关系
什么是Javascript JavaScript一种动态类型.弱类型.基于原型的客户端脚本语言,用来给HTML网页增加动态功能. JavaScript 的标准是 ECMAScript.截至 201 ...
- ASP.NET Core3.x 基础(1)
ASP.NET Core与2.x相比发生的一些变化: 项目结构 Blazor SignalR gRPC 关于Program类:Main方法,在系统执行时就会找到这个Main方法,实际上是配置了ASP. ...
- leetcode 877. Stone Game 详解 -——动态规划
原博客地址 https://blog.csdn.net/androidchanhao/article/details/81271077 题目链接 https://leetcode.com/proble ...
- 虚拟化技术之kvm基础
一.KVM简介 KVM的全称是kernel base virtual machine(基于内核的虚拟机)是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中. ...
- JavaScript中的正则表达式详解
摘要:javascript中的正则表达式作为相当重要的知识,本文将介绍正则表达式的相关知识和用法. 正则表达式(Regular Expression)是一门简单语言的语法规范,是强大.便捷.高效的文本 ...
- 【WC2013】 糖果公园 - 树上莫队
问题描述 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩.糖果公园的结构十分奇特,它由 n 个游览点构成, ...
- 手把手mc开服教学(内置开服核心)
QQ交流群:1125669835 mc开服教程 首先我们需要下载一个开服核心,然后把服务器核心放在一个空文件夹里(这是我的开服核心) 然后再打开(感jio这是废话,要耐心等待......) 然后你会发 ...
- Redis设计与实现——数据结构与对象
SDS 简单动态字符串 在redis数据库里面,包含字符串值得键值对在底层都是由SDS实现的. redis > set msg "hello world" 1)键值对的键是 ...
- python基础 Day13
python Day13 匿名函数(一句话函数,比较简单的函数) func=lambda a,b:a+b print(func(1,2)) ###结果:3 func=lambda a:(a[0],a[ ...
- ftp 搭建 centos 源
1. yum -y install vsftpd* 2. /etc/init.d/vsftpd restart 3. mount CentOS-7-aarch64-Everything-1810 ...