前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解压war包和重新压缩war包[通俗易懂]

解压war包和重新压缩war包[通俗易懂]

作者头像
全栈程序员站长
发布2022-11-10 15:18:56
1.7K0
发布2022-11-10 15:18:56
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

代码语言:javascript
复制
public class WarUtils {
/**
* 解压war包
* @param unWarPath war解压的路径
* @param warFile 解压的war包文件
*/
public static void unWar(String unWarPath,File warFile) {
try {
//读取文件流	
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(warFile));
//创建解压流的文件类型
ArchiveInputStream in = new ArchiveStreamFactory().createArchiveInputStream(ArchiveStreamFactory.JAR, bufferedInputStream);
JarArchiveEntry entry = null;
while ((entry = (JarArchiveEntry) in.getNextEntry()) != null) {
//判断目录是否存在
if (entry.isDirectory()) {
//创建解压文件目录
new File(unWarPath, entry.getName()).mkdir();
} else {
//输出文件流
OutputStream out = FileUtils.openOutputStream(new File(unWarPath, entry.getName()));
IOUtils.copy(in, out);
//关闭输出文件流
out.close();
}
}
in.close();
} catch (FileNotFoundException e) {
System.err.println("未找到war文件");
} catch (ArchiveException e) {
System.err.println("不支持的压缩格式");
} catch (IOException e) {
System.err.println("文件写入发生错误");
}
}
/**
* 判断war包是否已经存在,若存在则删除
* @param filePath
*/
public static void delWarFile(String filePath){
try {
File file = new File(filePath);
//判断文件是否存在
if(file.exists()){
file.delete();	
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 创建解压的war包目录,并返回目录路径
* @param warPath war所在路径
* @param unWarPath war包解压路径
* @return
*/
public static String mkDirByFileName(String warPath, String unWarPath){
try {
//创建文件
File warFile = new File(warPath);
//获取文件全部名称,包括后缀,如test.war
String fileFullName = warFile.getName();
if(fileFullName!=null){
//获取文件名称,如test
String fileName = fileFullName.substring(0, fileFullName.lastIndexOf("."));
//创建解压目录:解压路径+文件名称目录
String unWarFilePath = unWarPath+"\\"+fileName;
File file =new File(unWarFilePath);
//如果文件夹不存在则创建    
if(!file.exists()&&!file.isDirectory()){
file .mkdir();
}
//判断文件后后缀是否war
String fileSuffix = fileFullName.substring(fileFullName.lastIndexOf(".")+1, fileFullName.length());
if(fileSuffix.toLowerCase().equals("war")){
//解压war包
unWar(unWarFilePath,warFile);
return unWarFilePath;
}
}
return null;
} catch (Exception e) {
System.err.println(e.getMessage());
return null;
}
}
/** 
* @desc 将源文件/文件夹生成指定格式的压缩文件,格式war 
* @param resourePath 源文件/文件夹 
* @param targetPath  目的压缩文件保存路径 
* @return void 
* @throws Exception  
*/  
public static void compressedFile(String resourcesPath,String targetPath) throws Exception{
File resourcesFile = new File(resourcesPath);     //源文件  
File targetFile = new File(targetPath);           //目的  
//如果目的路径不存在,则新建  
if(!targetFile.exists()){       
targetFile.mkdirs();    
}           
String targetName = resourcesFile.getName()+".war";   //目的压缩文件名  
//压缩文件路径
String targetCompPath = targetPath+"\\"+targetName;
FileOutputStream outputStream = new FileOutputStream(targetCompPath);  
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(outputStream));  
createCompressedFile(out, resourcesFile, "");  
out.close();    
}       
/** 
* @desc 生成压缩文件。 
* 如果是文件夹,则使用递归,进行文件遍历、压缩 
* 如果是文件,直接压缩 
* @param out  输出流 
* @param file  目标文件 
* @return void 
* @throws Exception  	
*/  
public static void createCompressedFile(ZipOutputStream out,File file,String dir) throws Exception{  
//如果当前的是文件夹,则进行进一步处理  
if(file.isDirectory()){  
//得到文件列表信息  
File[] files = file.listFiles();  
//将文件夹添加到下一级打包目录  
out.putNextEntry(new ZipEntry(dir+"/"));  
dir = dir.length() == 0 ? "" : dir +"/";  
//循环将文件夹中的文件打包  
for(int i = 0 ; i < files.length ; i++){  
createCompressedFile(out, files[i], dir + files[i].getName());         //递归处理  
}  
} else{   //当前的是文件,打包处理  
//文件输入流  
FileInputStream fis = new FileInputStream(file);  
out.putNextEntry(new ZipEntry(dir));  
//进行写操作  
int j =  0;  
byte[] buffer = new byte[1024];  
while((j = fis.read(buffer)) > 0){  
out.write(buffer,0,j);  
}  
//关闭输入流  
fis.close();  
}  
}
//删除当前目录以及目录下的文件
public static boolean deleteDir(File delFile) {
if (delFile.isDirectory()) {
String[] children = delFile.list();
//递归删除目录中的子目录以及文件
for (int i=0; i<children.length; i++) {
boolean success = deleteDir(new File(delFile, children[i]));
if (!success) {
return false;
}
}
}
// 目录此时为空,可以删除
return delFile.delete();
}
//文件重新命名
public static void toFileRename(String filePath,String unWarPath){
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
String now = format.format(new Date());
File file = new File(filePath);
//判断文件是否存在
if(file.exists()){
//获取文件全部名称,包括后缀,如test.war
String fileFullName = file.getName();
//获取文件名称,如test
String fileName = fileFullName.substring(0, fileFullName.lastIndexOf("."));
String fileSuffix =  fileFullName.substring(fileFullName.lastIndexOf("."),fileFullName.length());
String renameFilePath = unWarPath +"\\"+fileName+"_bak"+now+fileSuffix;
file.renameTo(new File(renameFilePath));
}
}
}

涉及到的jar包有ant-1.8.2.jar,ant-launcher-1.8.2.jar,commons-lang-2.6.jar,commons-compress-1.10.jar,commons-io-2.4.jar

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月28日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档