分解因数 递归_递归分解WAR文件

分解因数 递归

抽象

是否曾经需要分解WAR文件以及分解WAR文件中的所有JAR文件? 是的,我也是!

我写了ferris-war-exploder来爆炸:

  1. 一个JAR文件
  2. 一个WAR文件,它找到的每个JAR文件也会爆炸。
  3. 包含每个JAR文件(请参阅#1)和WAR文件(请参阅#2)的EAR文件也爆炸了。

基本上,ferris-war-exploder会爆炸任何ZIP文件格式的东西。 ZIP格式的所有条目也会被分解。 这是递归发生的,因此任何可以爆炸的东西都会爆炸。

免责声明

这篇文章仅供参考。 在使用所提供的任何信息之前,请认真思考。 从中学到东西,但最终自己做出决定,风险自负。

要求

我使用以下主要技术完成了本文的所有工作。 您可能可以使用不同的技术或版本来做相同的事情,但不能保证。

  • NetBeans 11.2
  • Maven 3.3.9(与NetBeans捆绑在一起)
  • Java 11(zulu11.35.15-ca-jdk11.0.5-win_x64)

下载

访问我的GitHub页面https://github.com/mjremijan以查看我所有的开源项目。 这篇文章的代码位于: https : //github.com/mjremijan/ferris-war-exploder

让我们开始吧

ferris-war-exploder会爆炸任何ZIP文件格式的文件。 ZIP格式的所有条目也会被分解。 这是递归发生的,因此任何可以爆炸的东西都会爆炸。

您需要告诉它要爆炸的档案(WAR,JAR,EAR,ZIP)。

您需要告诉它在哪里爆炸存档。

注意一旦WAR爆炸,请参阅我的ferris-magic-number来分析所有.class文件。

清单1显示了启动应用程序的main()方法。 我有2个示例:爆炸一个JAR和爆炸一个WAR。

清单1 –

 public class Main { public static void main(String[] args) throws Exception { System.out.printf( "=== Welcome to Ferris WAR Exploder ===%n" ); new Unzip( "./src/test/jars/commons-lang3-3.7.jar" , "./target/unzipped/jar" ) .unzip(); new Unzip( "./src/test/wars/sample.war" , "./target/unzipped/war" ) .unzip(); System.out.printf( "%n=== DONE ===%n" ); }  } 

清单2显示了Unzip类。 此类包含有趣的代码以递归方式分解档案。 清单2中的所有内容都不难理解,因此请您自己仔细阅读。

清单2 –

 package org.ferris.war.exploder;  import java.io.File;  import java.io.FileInputStream;  import java.io.FileOutputStream;  import java.io.IOException;  import java.util.zip.ZipEntry;  import java.util.zip.ZipFile;  import java.util.zip.ZipInputStream;  /** * * @author Michael Remijan mjremijan@yahoo.com @mjremijan */  public class Unzip { protected File zipFile; protected File destinationDirectory; public Unzip(String zipFilePath, String destinationDirectoryPath) { setZipFile(zipFilePath); setDestinationDirectory(destinationDirectoryPath); } public Unzip(File zipFile) { this .zipFile = zipFile; setDestinationDirectory(zipFile.getParent()); } protected void setDestinationDirectory(String destinationDirectoryPath) { destinationDirectory = new File(destinationDirectoryPath, zipFile.getName()); if (destinationDirectory.exists() && destinationDirectory.isDirectory()) { throw new RuntimeException( String.format( "The destination directory \"%s\" already exists." , destinationDirectory.getPath() ) ); } if (destinationDirectory.exists() && destinationDirectory.isFile()) { destinationDirectory = new File(destinationDirectoryPath, zipFile.getName() + ".d" ); } mkdirs(destinationDirectory, "Failed to create the destination directory \"%s\"." ); } protected void setZipFile(String zipFilePath) { zipFile = new File(zipFilePath); if (!zipFile.exists()) { throw new RuntimeException( String.format( "The file \"%s\" does not exist" , zipFile.getPath() ) ); } if (!zipFile.canRead()) { throw new RuntimeException( String.format( "The file \"%s\" is not readable" , zipFile.getPath() ) ); } } protected void unzip() throws Exception { System.out.printf( "%n=== Unipping %s ===%n%n" , zipFile.getPath()); try (ZipInputStream zip = new ZipInputStream( new FileInputStream(zipFile)); ){ for (ZipEntry z = zip.getNextEntry(); z != null ; z = zip.getNextEntry()) { if (z.isDirectory()) { mkdirs( new File(destinationDirectory, z.getName()), "Failed to create a zip entry directory \"%s\"" ); } else { File zfile = new File(destinationDirectory, z.getName()); mkdirs(zfile.getParentFile(), "Failed to create parent directory for zip entry file \"%s\"." ); File unzippedFile = unzipEntry(z, zip); if (isZip(unzippedFile)) { new Unzip(unzippedFile).unzip(); } } } } } protected boolean isZip(File file) { boolean b = false ; try { b = new ZipFile(file).getName().length() > 0 ; } catch (IOException ignore) {} return b; } protected File unzipEntry(ZipEntry z, ZipInputStream zip) throws Exception { File zfile = new File(destinationDirectory, z.getName()); System.out.printf( " %s%n" , zfile.getAbsolutePath()); try ( FileOutputStream out = new FileOutputStream(zfile)) { zip.transferTo(out); } zip.closeEntry();; return zfile; } protected void mkdirs(File dir, String errorMessageFormat) { if (dir.exists() && dir.isDirectory()) { return ; } dir.mkdirs(); if (!dir.exists()) { throw new RuntimeException( String.format(errorMessageFormat, dir.getPath() ) ); } }  } 

摘要

ferris-war-exploder项目并不太复杂,但是当您需要完全爆炸WAR或EAR归档文件时,它非常方便。 请享用!

参考资料

ZipOutputStream。 (nd)。 Oracle 从https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/zip/ZipOutputStream.html检索。

翻译自: https://www.javacodegeeks.com/2020/03/explode-a-war-file-recursively.html

分解因数 递归

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jvm(2)-java内存区域

【0】README 0.1)本文转自 深入理解jvm, 旨在学习 java内存区域 的基础知识; 【1】运行时数据区域 1)jvm 所管理的内存将会包括以下几个运行时数据区域 1.1)方法区;(线程共享) 1.2&…

Java Socket编程总结

一、网络API InetAddress     用于标识网络上的硬件资源,主要是IP地址 URL         统一资源定位符,通过URL可以直接读取或写入网络上的数据Sockets      使用TCP协议实现的网络通信Socket相关的类Datagram     使用UDP协议&am…

java插入排序_Java程序要插入排序

java插入排序Java程序插入示例的排序。 显示了示例仿真以及时间复杂度。 插入排序是一种简单的排序算法,可以一次构建一个最终的排序数组(或列表)。 它比冒泡排序有效得多,并且在大型列表上的效率比快速排序 ,堆排序或…

jvm(2)-JVM内存的设置(解决eclipse下out of memory问题)

【0】README 0.1)本文转自: http://blog.csdn.net/sjf0115/article/details/8889201 一、JVM内存的设置的原理 默认的java虚拟机的大小比较小,在对大数据进行处理时java就会报错:java.lang.OutOfMemoryError。 设置jvm内存的方…

Java Servlet总结

一、Servlet简介 Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实…

java oca_OCA第1部分中的Java难题

java oca我在业余时间正在阅读Mala Gupta的Oracle认证Java SE程序员助理书,我对所学到的一些新知识感到惊讶。 有时候他们真的没有道理,有时候他们说得通,但真的让人惊讶。 因此,在本系列文章中,我想将它们共享为“ Ja…

jvm(1)-走进java

【0】README0.1)本文转自 深入理解 jvm,旨在了解 java 体系结构;【1】java技术体系1) Sun 官方所定义的java 技术系统包括以下几个组成部分: java 程序设计语言;各种硬件平台上的java 虚拟机;Cl…

Java 高并发下的实践

一、使用的技术HashMap ConcurrentHashMap Lock ReadWriteLock synchronized 二、一百万并发下的组合 ConcurrentLockMap /** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* …

java oca_OCA第2部分中的Java难题

java oca欢迎使用OCA的Java Puzzlers的第二部分。 在这一部分中,我们将看到一个有趣的案例,涉及Java 7附带的数字文字中的下划线分隔符。 在下面的类中,您可以在十进制文字中看到分隔符下划线。 还请注意,该类现在可以正常编译。…

jvm(2)-OutOfMemoryError 异常(内存溢出异常)

【0】README0.1)本文转自 深入理解 jvm, 旨在学习 OutOfMemoryError 异常(内存溢出异常) 的触发类型;0)准备知识0.1)除了程序计数器外,虚拟机内存的其他几个运行时区域(方…

java oca_OCA第7部分中的Java难题

java oca在OCA系列的Java Puzzlers的这一部分中,我将展示定义字符串和与之相关的潜在惊喜的多种方法。 创建字符串的两种基本类型是使用new关键字和仅使用字符串文字来创建。 String strWithNew new String( "hey" ); String strWithLiteral "ho&…

Java GC总结

一、gc两大基本算法1、引用计数法 2、根搜索法 二、gc改进收集算法 1、标记-清除算法 2、复制算法 3、标记-整理算法 分代收集算法 三、gc的类型 串行垃圾回收器(Serial Garbage Collector) 并行垃圾回收器(Parallel Garbage Collecto…

让CentOS能用yum自动安装rar和unrar

【0】README 0.1)本文转自: http://www.centoscn.com/CentOS/config/2015/0520/5485.html 目的:让CentOS能用yum自动安装rar和unrar 系统环境: CentOS 7.0 具体操作步骤如下: 1.编辑文件 编辑dag.repo文件&#xff0c…

java oca_OCA第6部分中的Java难题

java oca即使对于新的Java开发人员,构造函数也可能不是什么大谜。 本质上,当您创建一个类的实例时,该类的构造函数就会启动。 在Java Puzzlers系列的第6部分中,我们将看到一个与构造函数有关的案例。 public class Puzzler { publ…

Java 内存泄露总结

一、Java内存泄漏引起的原因:内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。 二、内存泄露的方式 1、静态集合类引起内存泄漏 像HashMap、Vector等的使…

使用Mockito的Mock Void方法

大家好! 在我们之前的博客关于thenReturn和thenAnswer模拟方法之间的区别之后 ,我们又回来了关于Mockito的另一个有趣的博客。 在这里,我们将讨论“如何用Mockito模拟无效方法”。 让我们开始吧! 在编写代码时,总是至…

System.gc()调用 - 适用的场景

一、System.gc()调用 System.gc()用于调用垃圾收集器,在调用时,垃圾收集器将运行以回收未使用的内存空间。它将尝试释放被丢弃对象占用的内存。然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用。我们…

将模板方法模式应用到kmeans聚类算法

【0】README 0.1)本文描述和源代码均为原创,旨在说明 如何将模板方法模式应用到kmean聚类算法; 0.2)模板方法模式的intro, 参见 模板方法模式 0.3)for kmeans alg source code, please visit kmeans&a…

java oca_OCA第4部分中的Java难题

java oca在Java Puzzlers的第四部分中,我们有一些与char类型有关的东西。 public class Puzzler { public static void main(String[] args){ char myChar a ; myChar; System.out.println(myChar); } } 您可能已经猜到了。 它将打印“ b”,其原因是c…

毕业设计的十大问题

一、vue的跨域问题 1、前端本地用代理软件代理服务器 在vue项目下的 config/index.js 文件里面配置代理proxyTable:proxyTable: {/login: {target: http://192.168.1.1:8080/ntd/data,changeOrigin: true,pathRewrite: {^/login:}}2、后台服务器开启允许跨域的响应头 直接在tom…