发布jar包到服务器读取resource目录下文件
时间:2020-04-13
本文章向大家介绍发布jar包到服务器读取resource目录下文件,主要包括发布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(); } }
原文地址:https://www.cnblogs.com/Soy-technology/p/12693026.html
- 1599: [Usaco2008 Oct]笨重的石子
- 【LeetCode 136】 关关的刷题日记33 Intersection of Two
- 1218: [HNOI2003]激光炸弹
- Java多线程高并发学习笔记(一)——Thread&Runnable
- 1257: [CQOI2007]余数之和sum
- 【LeetCode 136】 关关的刷题日记34 Intersection of Two Arrays II
- 1724: [Usaco2006 Nov]Fence Repair 切割木板
- 【LeetCode 202】 关关的刷题日记35 – Leetcode 202. Happy Number
- JAVA多线程高并发学习笔记(三)——Callable、Future和FutureTask
- 算法模板——Trie树
- JavaScript Alert 函数执行顺序问题
- 算法模板——计算几何1(图形面积)
- 算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile)
- 【LeetCode 242】 关关的刷题日记36 Valid Anagram
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python|进制转换问题
- 数据库|MySQL制作成绩表单视图
- Spark Core——RDD何以替代Hadoop MapReduce?
- k8s基础概念及术语
- msf工具之木马程序制作以及伪装
- 一次服务器沦陷为肉鸡后的实战排查过程!
- 使用 centOS 7 部署前端项目
- PHP rand() 函数随机整数。
- PHP使用htmlspecialchars方法实现像ASP的Server.HTMLEncode一样的效果
- jquery.ajax()怎么把获取来的内容转为JSON,并使用。
- Spring:IOC 控制反转
- Spring:AOP 面向切面编程
- JavaScript进阶教程(5)-一文让你搞懂作用域链和闭包
- JavaScript进阶教程(6)—硬核动图让你轻松弄懂递归与深浅拷贝
- Spring:JDBC Template,声明式事务