当前位置: 首页 > 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.…...

一键启动翻译服务:Hunyuan-MT-7B-WEBUI详细使用教程(附加速链接)

一键启动翻译服务&#xff1a;Hunyuan-MT-7B-WEBUI详细使用教程&#xff08;附加速链接&#xff09; 1. 为什么选择Hunyuan-MT-7B-WEBUI 在全球化交流日益频繁的今天&#xff0c;语言障碍成为许多企业和个人面临的现实挑战。传统翻译工具要么准确度不足&#xff0c;要么部署复…...

解锁Unity游戏定制潜能:MelonLoader全方位应用指南

解锁Unity游戏定制潜能&#xff1a;MelonLoader全方位应用指南 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader 副标题&#xff…...

Phi-3-Mini-128K实战JavaScript:构建前端智能代码提示插件

Phi-3-Mini-128K实战JavaScript&#xff1a;构建前端智能代码提示插件 最近在折腾前端项目时&#xff0c;我总在想&#xff0c;要是写代码时能有个更懂我的助手就好了。现有的代码补全工具虽然不错&#xff0c;但很多时候还是停留在语法层面&#xff0c;对于业务逻辑、复杂函数…...

终极分屏游戏解决方案:Nucleus Co-Op 让单机游戏变身多人派对

终极分屏游戏解决方案&#xff1a;Nucleus Co-Op 让单机游戏变身多人派对 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 还在为单机游戏无法本地多…...

低成本GPU算力优化:cv_unet_image-colorization显存占用实测与调优

低成本GPU算力优化&#xff1a;cv_unet_image-colorization显存占用实测与调优 1. 项目背景与价值 在数字影像修复领域&#xff0c;AI图像上色技术正成为越来越受欢迎的工具。基于UNet架构的cv_unet_image-colorization模型&#xff0c;通过深度学习算法能够智能识别黑白图像…...

158页精品PPT | 某大型研发制造集团信息化IT规划整体方案

许多公司在数字化转型过程中会遇到一些共同的挑战&#xff0c;比如数据孤岛、技术更新慢、员工技能不足等。这些问题会导致企业效率低下&#xff0c;难以适应市场变化。针对这些问题&#xff0c;我们提出了一套解决方案&#xff0c;核心目标是帮助企业提升数字化水平&#xff0…...

Dan Koe: 如果你有多重兴趣,请不要浪费接下来的2-3年

本文整理自 Dan Koe 原文。Dan Koe 是 YouTube、X 等平台拥有数百万粉丝的个人成长领域创作者&#xff0c;以"一人公司"理念、深度内容创作和高效 AI 工作流著称。你是否曾因为无法只专注一件事而感到自责&#xff1f; 你学设计&#xff0c;又想学编程&#xff1b;读…...

如何将笔记从 iCloud 传输到 iPhone:分步指南

iPhone 上的“备忘录”应用是一款便捷的工具&#xff0c;可以用来记录待办事项、日记、想法等等。它能帮助我们追踪需要完成的事情。借助 iCloud 的自动同步功能&#xff0c;你的备忘录可以安全地存储在云端&#xff0c;并可通过任何 Apple 设备甚至电脑访问。将笔记从 iPhone …...

OFA模型在VMware虚拟机中的开发测试环境搭建

OFA模型在VMware虚拟机中的开发测试环境搭建 对于很多刚接触AI模型开发的个人开发者或学生来说&#xff0c;最大的门槛往往不是算法本身&#xff0c;而是硬件。一块性能足够的独立GPU价格不菲&#xff0c;让很多人在起步阶段就望而却步。难道没有物理GPU&#xff0c;就真的没法…...

MongoDB(70)如何使用副本集进行备份?

使用副本集进行备份是一个常见的MongoDB备份策略&#xff0c;因为副本集提供了数据冗余和高可用性。通过从副本集中读取数据&#xff0c;可以在不影响主节点的情况下进行备份。以下是详细的步骤和示例代码&#xff0c;展示如何使用 MongoDB 副本集进行备份。方法一&#xff1a;…...