当前位置: 首页 > news >正文

Java解析嵌套jar中class文件

一、简述

Maven项目通过package打成jar包后,jar包中包含所有依赖lib文件。本文介绍了两种方式解析嵌套jar中的class文件,一种是通过spring-boot-loader包JarFileArchive,另一种是util包中JarFile。

二、JarFileArchive方式

1.spring-boot-loader依赖引入

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-loader</artifactId><version>2.2.4.RELEASE</version>
</dependency>

 2.demo案例

   public static void main(String args[]) throws Exception {String jarPath = "C:\\Users\\root\\Desktop\\make-test.jar";// 方案一:spring-boot-loaderlong start1 = System.currentTimeMillis();getClassInfoByJarLib(jarPath);long end1 = System.currentTimeMillis();log.info("收集所有lib类ClassInfo,花费时间={}",(end1-start1));} public static void getClassInfoByJarLib(String jarPath) {String filePath = "file:/"+ URLDecoder.decode(jarPath, StandardCharsets.UTF_8).replaceAll("\\\\","/")+"!/";String rootJarPath = "jar:"+ filePath;try {JarFileArchive jarFileArchive = new JarFileArchive(new Handler().getRootJarFileFromUrl(new URL(rootJarPath)));//getNestedArchives获取嵌套的jar等文件,参数是个EntryFilter,过滤条件jarFileArchive.getNestedArchives(entry -> entry.getName().startsWith("BOOT-INF/lib/") && entry.getName().endsWith(".jar")).forEach(archive -> {archive.iterator().forEachRemaining(entry -> {String entryName = entry.getName();// 过滤嵌套jar包中字节码文件if (entryName.endsWith(".class")) {String className = entryName.replace('/', '.').replace(".class", "");log.info("className:{}",className);}});});} catch (IOException e) {log.error("解析嵌套jarLib中ClassInfo异常,jarPath={}",jarPath,e);throw new RuntimeException(e);}}

三、JarFile方式

1.demo案例 

   public static void main(String args[]) throws Exception {String jarPath = "C:\\Users\\root\\Desktop\\make-test.jar";// 方案二:JarFilelong start2 = System.currentTimeMillis();processJar(jarPath);long end2 = System.currentTimeMillis();log.info("收集所有lib类ClassInfo,花费时间={}",(end2-start2));} private static void processJar(String jarPath){try (JarFile jarFile = new JarFile(new File(jarPath))) {jarFile.stream().parallel()// 过滤出所有符合要求的jar包.filter(entry -> !entry.isDirectory() && entry.getName().startsWith("BOOT-INF/lib/") && entry.getName().endsWith(".jar")).forEach(entry -> processNestedJar(jarFile, entry.getName()));} catch (IOException e) {log.error("解析嵌套jarLib中ClassInfo异常,jarPath={}",jarPath,e);throw new RuntimeException(e);}}private static void processNestedJar(JarFile jarFile, String entryName){// 处理嵌套jar文件try (InputStream nestedJarStream = jarFile.getInputStream(jarFile.getJarEntry(entryName));JarInputStream jarInputStream = new JarInputStream(nestedJarStream)) {JarEntry nestedEntry;while ((nestedEntry = jarInputStream.getNextJarEntry()) != null) {if (nestedEntry.isDirectory()) {continue;}String nestedEntryName = nestedEntry.getName();if (!nestedEntryName.endsWith(".class")) {continue;}try {String className = nestedEntryName.replace('/', '.').replace(".class", "");log.info("className:{}",className);} catch (Exception e) {log.error("目标类={}查找失败",nestedEntryName,e);throw new RuntimeException(e);}}} catch (IOException e) {log.error("目标类={}查找失败",entryName,e);throw new RuntimeException(e);}}

四、两种方式对比

实测项目make-test.jar中所有依赖lib约200个,其中所有class字节码文件约7万多个。方案JarFileArchive约1.5s全部解析,方案JarFile约6s全部解析。

相关文章:

Java解析嵌套jar中class文件

一、简述 Maven项目通过package打成jar包后&#xff0c;jar包中包含所有依赖lib文件。本文介绍了两种方式解析嵌套jar中的class文件&#xff0c;一种是通过spring-boot-loader包JarFileArchive&#xff0c;另一种是util包中JarFile。 二、JarFileArchive方式 1.spring-boot-…...

【含文档】基于Springboot+Vue的高校竞赛管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 系统定义了三个…...

在大模型应用层面区分对比检索增强生成RAG技术和知识库技术

在前文&#xff1a; 《RAG(Retrieval-Augmented Generation)检索增强生成技术基础了解学习与实践》 初步了解实践了RAG技术&#xff0c;后面好多朋友也在沟通聊到了前面大模型另一项技术就是本地知识库方法&#xff0c;之前基于LangChain本地知识库的方式&#xff0c;可以本地…...

云和恩墨携手华为,发布zCloud数据库备份管理一体机并宣布共建数据保护生态...

为期三天的第九届华为全联接大会&#xff08;HUAWEI CONNECT 2024&#xff09;于9月19日在上海世博中心&展览馆盛大召开。20日下午&#xff0c;一场围绕“全场景数据保护&#xff0c;护航数智化时代”的专题论坛举办&#xff0c;云和恩墨受邀参加&#xff0c;并期待与华为合…...

Linux系统备份Gitee等云git所有仓库与所有分支的数字资产

思路&#xff1a; 1. ssh 配置 2. reps.txt 列出所有仓库名 3. exp的自动化备份脚本 -- 环境安装&#xff1a; exp需要依赖安装的文件&#xff0c;所以先执行下(以ubuntu为例)&#xff1a; sudo apt-get install expect 操作步骤&#xff1a; ssh 配置 1. 添加公钥至 …...

JavaScript 条件循环语句

‌条件循环语句‌是编程中的一种控制结构&#xff0c;它允许程序根据特定条件重复执行一段代码&#xff0c;直到满足某个条件为止。这种结构通常包括条件语句和循环语句&#xff0c;它们共同作用&#xff0c;使得程序能够根据预设的条件来决定是否继续执行循环体中的代码。 fo…...

LeetCode2207解题思路

题目描述 字符串中最多数目的子序列 解题思路&#xff1a; 题目要求我们找到在 text 中 找到最多可组成 pattern 的字符串个数&#xff0c;并且允许在 text 的任意位置插入 pattern 中一个字符&#xff0c;也就是说我们只需要考虑 text 中的 pattern 含有的字符即可。例如示例…...

opencv图像增强十四:opencv两种白平衡介绍及实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、白平衡介绍二、灰度世界法三、完美反射法 前言 在摄影与影像领域&#xff0c;白平衡是一个至关重要的概念。它直接影响着画面的色彩表现&#xff0c;关系到…...

Linux标准IO(四)-格式化I/O输入

C 库函数提供了 3 个格式化输入函数&#xff0c;包括&#xff1a;scanf()、fscanf()、sscanf()&#xff0c;其函数定义如下所示&#xff1a; #include <stdio.h> int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int sscanf(c…...

分布式安装LNMP

目录 搭建LNMP架构 安装mysql 1.上传mysql软件包&#xff0c;关闭防火墙和核心防护 2.安装环境依赖包&#xff0c;桌面安装可能有自带的数据库除 3.配置软件模块 4.编译及安装 5.创建mysql用户 6.修改mysql 配置文件 7.更改mysql安装目录和配置文件的属主属组 8.设置…...

TFTP协议

目录 一、TFTP协议概述 1.1 TFTP协议简介 1.2 TFTP协议特点 二、TFTP协议原理 2.1 TFTP协议工作流程 2.2 TFTP协议数据包格式 三、TFTP协议应用场景 3.1 网络设备配置文件传输 3.2 虚拟机镜像文件传输 3.3 IoT设备固件升级 四、TFTP协议优化方法 4.1 增加超时重传机…...

FPGA随记-二进制转格雷码

反射二进制码&#xff08;RBC&#xff09;&#xff0c;也称为反射二进制&#xff08;RB&#xff09;或格雷码&#xff08;Gray code&#xff09;&#xff0c;得名于Frank Gray&#xff0c;是二进制数制的一种排列方式&#xff0c;使得连续两个值之间仅有一个比特&#xff08;二…...

Android常用C++特性之std::unique_lock

声明&#xff1a;本文内容生成自ChatGPT&#xff0c;目的是为方便大家了解学习作为引用到作者的其他文章中。 std::unique_lock 是 C 标准库中的一种灵活的锁管理类&#xff0c;提供了比 std::lock_guard 更多的功能和灵活性。它可以控制对互斥锁&#xff08;std::mutex&#x…...

网络与信息安全工程师(工信部教育与考试中心)

在当今数字化时代&#xff0c;大量的敏感信息与业务流程在网络上传输和处理&#xff0c;使得网络与信息安全成为保障企业运营、政务管理以及金融交易等关键领域不可忽视的一环。 因此&#xff0c;对网络安全专家的需求日益增长。 例如&#xff0c;金融机构、大型电信运营商以…...

uni-app+vue3开发微信小程序使用本地图片渲染不出来报错[渲染层网络层错误]Failed to load local image resource

我把图片放在assets里面页面通过相对路径引入。结果一直报错。 最后我把图片放在static文件夹下面。然后修改路径指向static就可以了 或者是我们必须先import 这个图片然后在使用 import banner1 from ../../assets/images/banner/banner1.png; <image :src"banner…...

Leetcode 93-复原 IP 地址

有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 ‘.’ 分隔。 例如&#xff1a;“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址&#xff0c;但是 “0.011.255.245”、“192.168.…...

unity 中向指定的动画片段添加动画事件,并播放动画,同时获取动画片段的时长。

示例一 using UnityEngine;using System;public static class AnimationUtils{/// <summary>/// 向指定的动画片段添加动画事件&#xff0c;并播放动画&#xff0c;同时获取动画片段的时长。/// </summary>/// <param name"_animator">需要添加动画…...

JavaEE:探索网络世界的魅力——玩转UDP编程

文章目录 UDPUDP的特点UDP协议端格式校验和前置知识校验和具体是如何工作的? UDP UDP的特点 UDP传输的过程类似于寄信. 无连接: 知道对端的IP和端口号就直接进行传输,不需要建立连接.不可靠: 没有确认机制,没有重传机制,如果因为网络故障导致该段无法到达对方,UDP协议也不会…...

生成式人工智能:企业数字化转型的全新引擎,深度解析The Open Group 2024生态系统架构·可持续发展年度大会

生成式人工智能&#xff1a;企业数字化转型的全新引擎&#xff0c;深度解析The Open Group 2024生态系统架构可持续发展年度大会 随着人工智能技术的飞速发展&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;正以惊人的速度渗透到各行各业&#xff0c;成为企…...

阿里云k8s如何创建可用的api token

阿里云的 Kubernetes 配置文件&#xff08;如您所提供的 YAML 格式文件&#xff09;通常不会直接包含用于连接 Kubernetes 集群的令牌。而是包含了客户端证书和私钥数据&#xff0c;这些是用于通过证书验证而不是令牌验证的方式来与 Kubernetes API 服务器进行安全交互的。 1.…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

STM32标准库-ADC数模转换器

文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”&#xff1a;输入模块&#xff08;GPIO、温度、V_REFINT&#xff09;1.4.2 信号 “调度站”&#xff1a;多路开关1.4.3 信号 “加工厂”&#xff1a;ADC 转换器&#xff08;规则组 注入…...

第22节 Node.js JXcore 打包

Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本&#xff0c;基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...

Linux入门课的思维导图

耗时两周&#xff0c;终于把慕课网上的Linux的基础入门课实操、总结完了&#xff01; 第一次以Blog的形式做学习记录&#xff0c;过程很有意思&#xff0c;但也很耗时。 课程时长5h&#xff0c;涉及到很多专有名词&#xff0c;要去逐个查找&#xff0c;以前接触过的概念因为时…...