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

Java读写Jar

Java提供了读写jar的类库Java.util.jar,Java获取解析jar包的工具类如下:

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.jar.Attributes;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.Manifest;/*** jar包解析器**/
public class JarAnalyzer {/*** jar 文件路径*/private String jarFilePath;/*** 构造函数** @param jarFilePath 文件路径*/public jarAnalyzer(String jarFilePath) {this.jarFilePath = jarFilePath;}/*** 获取jar包属性** @return jar包所有属性* @throws IOException*/public Map<String, String> getJarAttrs() throws IOException {URL url = new File(this.jarFilePath).toURI().toURL();URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url});URL manifestUrl = urlClassLoader.findResource("META-INF/MANIFEST.MF");Manifest manifest = new Manifest(manifestUrl.openStream());Attributes mainAttributes = manifest.getMainAttributes();Map<String, String> attrs = new HashMap<>();mainAttributes.forEach((key, value) -> {attrs.put(String.valueOf(key), String.valueOf(value));});return attrs;}/*** 获取入口类全路径名** @return 入口类全路径名* @throws IOException*/public String getProgamClass() throws IOException {for (String key : getJarAttrs().keySet()) {if ("program-class".equals(key)) {return getJarAttrs().get(key);}}return null;}/*** 获取jar包所有类名** @return jar包所有类名* @throws IOException*/public Set<String> getAllClasses() throws IOException {File givenFile = new File(this.jarFilePath);Set<String> classNames = new HashSet<>();try (JarFile jarFile = new JarFile(givenFile)) {Enumeration<JarEntry> e = jarFile.entries();while (e.hasMoreElements()) {JarEntry jarEntry = e.nextElement();if (jarEntry.getName().endsWith(".class")) {String className = jarEntry.getName().replace("/", ".").replace(".class", "");classNames.add(className);}}return classNames;}}}

测试类


public static void main(String[] args) throws Exception {String jarPath = "/xxx/TopSpeedWindowing.jar";JarAnalyzer jarAnalyzer = new JarAnalyzer(jarPath);log.info("jar包所有属性:");jarAnalyzer.getJarAttrs().forEach((key, value) -> {log.info("key={},value={}", key, value);});log.info("MainClass -> {}", jarAnalyzer.getProgamClass());log.info("jar包含有的类:");jarAnalyzer.getAllClasses().forEach(clzz -> {log.info("className ->{}", clzz);});}

测试解析结果

参考文献:

https://stackoverflow.com/questions/1272648/reading-my-own-jars-manifest

https://www.baeldung.com/jar-file-get-class-names

相关文章:

Java读写Jar

Java提供了读写jar的类库Java.util.jar&#xff0c;Java获取解析jar包的工具类如下&#xff1a; import java.io.File; import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; import java.util.Enumeration; import java.util.HashMap; import …...

【四元数简述】

w cos(theta/2) x ax * sin(theta/2) y ay * sin(theta/2) z az * sin(theta/2) 向量(x,y,z)是旋转轴 a 是任意正数 theta是旋转角度。 上面就是一个四元数表示旋转。 如何使用 空间中向量&#xff08;1,2,3&#xff09;扩展为&#xff08;0,1,2,3&#…...

ClickHouse SQL 查询优化

1 单表查询 1.1 Prewhere替代where Prewhere和where语句的作用相同&#xff0c;用来过滤数据。不同之处在于prewhere只支持 *MergeTree 族系列引擎的表&#xff0c;首先会读取指定的列数据&#xff0c;来判断数据过滤&#xff0c;等待数据过滤之后再读取select 声明的列字段来补…...

「Verilog学习笔记」数据选择器实现逻辑电路

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 将变量A、B接入4选1数据选择器选择输入端S0 S1。将变量C分配在数据输入端。从表中可以看出输出L与变量C的关系。 当AB00时选通D0而此时L0&#xff0c;所以数据端D0接0…...

【Go入门】Web工作方式

【Go入门】 Web工作方式 我们平时浏览网页的时候,会打开浏览器&#xff0c;输入网址后按下回车键&#xff0c;然后就会显示出你想要浏览的内容。在这个看似简单的用户行为背后&#xff0c;到底隐藏了些什么呢&#xff1f; 对于普通的上网过程&#xff0c;系统其实是这样做的&…...

综述:目标检测二十年(机翻版)(未完

原文地址 20年来的目标检测&#xff1a;一项调查 摘要关键词一 介绍二 目标检测二十年A.一个目标检测的路线图1)里程碑&#xff1a;传统探测器Viola Jones探测器HOG检测器基于可变形零件的模型&#xff08;DPM&#xff09; 2)里程碑&#xff1a;基于CNN的两阶段探测器RCNNSPPN…...

quinn源码解析:QUIC数据包是如何发送的

quinn源码解析&#xff1a;QUIC数据包是如何发送的 简介QUIC协议中的概念endpoint&#xff08;端点&#xff09;connection&#xff08;连接&#xff09;Stream&#xff08;流&#xff09;Frame (帧) 发包过程解析SendStream::write_allConnectionDriverEndpointDriver 简介 q…...

scss的高级用法——循环

周末愉快呀&#xff01;一起来学一点简单但非常有用的css小知识。 最近在一个项目中看到以下css class写法&#xff1a; 了解过tailwind css或者unocss的都知道&#xff0c;从命名就可以看出有以下样式&#xff1a; font-size: 30pxmargin-left: 5px;margin-top: 10px; 于是…...

Linux安装Chrome浏览器 -linux安装choeme

Linux 操作系统一般自带的浏览器是 FireFox&#xff0c;不过有些用户可能更喜欢 Google 出品的 Chrome 浏览器。本教程将介绍如何在 Linux 系统上安装 Chrome 浏览器&#xff0c;以及可能会遇到的一些问题解决方案。 下载 Chrome 安装包 需要下载 Chrome 的安装包。可以在 Go…...

六大排序(插入排序、希尔排序、冒泡排序、选择排序、堆排序、快速排序)未完

文章目录 排序一、 排序的概念1.排序&#xff1a;2.稳定性&#xff1a;3.内部排序&#xff1a;4.外部排序&#xff1a; 二、插入排序1.直接插入排序2.希尔排序 三、选择排序1.直接选择排序方法一方法二直接插入排序和直接排序的区别 2.堆排序 四、交换排序1.冒泡排序2.快速排序…...

JVM垃圾回收相关概念

目录 一、System.gc()的理解 二、内存溢出与内存泄露 &#xff08;一&#xff09;OOM &#xff08;二&#xff09;内存泄露 三、StopTheWorld 四、垃圾回收的并行与并发 五、安全点与安全区域 &#xff08;一&#xff09;安全点 &#xff08;二&#xff09;安全区域 …...

C++各种字符转换

C各种字符转换 一.如何将char数组转化为string类型二. string转char数组&#xff1a;参考 一.如何将char数组转化为string类型 在C中&#xff0c;可以使用string的构造函数或者赋值操作符来将char数组转换为string类型。 方法1&#xff1a;使用string的构造函数 const char* c…...

MSSQL-逻辑级常用命令

--SQL Server 查询表的记录数 --one: 使用系统表. SELECT object_name (i.id) TableName, rows as RowCnt FROM sysindexes i INNER JOIN sysObjects o ON (o.id i.id AND o.xType U ) WHERE indid < 2 ORDER BY rows desc ————————————…...

【如何学习Python自动化测试】—— 时间等待

3 、 时间等待 在做自动化测试时&#xff0c;难免会碰到一些问题&#xff0c;比如你在脚本中操作某个对象时&#xff0c; 页面还没有加载出来&#xff0c;你的操作语句已经被执行&#xff0c;从而导致脚本执行失败&#xff0c;针对这样的问题 webdriver 提供了等待操作&#xf…...

《数字图像处理-OpenCV/Python》连载(44)图像的投影变换

《数字图像处理-OpenCV/Python》连载&#xff08;44&#xff09;图像的投影变换 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 本书CSDN独家连载专栏&#xff1a;https://blog.csdn.net/youcans/category_12418787.html 第 6 章 图像的几何变换 几何变…...

AI机器学习 | 基于librosa库和使用scikit-learn库中的分类器进行语音识别

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…...

Asp.net MVC Api项目搭建

整个解决方案按照分层思想来划分不同功能模块&#xff0c;以提供User服务的Api为需求&#xff0c;各个层次的具体实现如下所示&#xff1a; 1、新建数据库User表 数据库使用SQLExpress版本&#xff0c;表的定义如下所示&#xff1a; CREATE TABLE [dbo].[User] ([Id] …...

C语言中文网 - Shell脚本 - 8

第1章 Shell基础&#xff08;开胃菜&#xff09; 8. Linux Shell命令提示符 启动 Linux 桌面环境自带的终端模拟包&#xff0c;或者从 Linux 控制台登录后&#xff0c;便可以看到 Shell 命令提示符。看见命令提示符就意味着可以输入命令了。命令提示符不是命令的一部分&#x…...

性能测试学习——项目环境搭建和Jmete学习二

项目环境搭建、Jmeter学习二 环境的部署虚拟机的安装虚拟机中添加项目操作步骤 使用环境的注意事项Jmeter的安装和简单使用Jemter的使用的进阶Jemter元件 Jmeter属性执行顺序和作用域作用域以自定义用户变量和用户参数(前置处理器)为例如何解决用户变量和线程组同级时&#xff…...

C++标准模板库(STL)-map介绍

C标准库中的map是一种关联容器&#xff0c;它提供了键值对的映射关系。每个键值对中的键都是唯一的&#xff0c;通过键可以访问对应的值。 map基本操作 插入元素&#xff1a; 使用insert函数插入元素&#xff0c;该函数有两种形式&#xff1a; // 插入一个pair<const Ke…...

商城首页小程序源码 购物商场小程序系统 开源商城系统 基于H5小程序Uniapp开发

【核心功能】 – 前端小程序&#xff1a;uniapp 1、顶部自定义透明导航 2、搜索框 3、动态轮播图 4、动态分类导航 5、动态通知提醒 6、宫格商品列表 7、列表上滑预加载 8、底部导航 – 系统架构&#xff1a;uniapp&#xff0c;代码规范 – 适合懂uniapp的朋友使用 …...

Go语言中的正则表达式

Go语言中的正则表达式 1. 正则表达式的基本概念 正则表达式是一种用于匹配字符串中字符组合的模式。在Go语言中&#xff0c;正则表达式通过regexp包来实现。 2. 基本用法 2.1 编译正则表达式 package mainimport ("fmt""regexp" )func main() {// 编译正则…...

学Simulink——基于Simulink的基于扰动观测器(DOB)的负载扰动补偿

目录 手把手教你学Simulink——基于Simulink的基于扰动观测器(DOB)的负载扰动补偿​ 摘要​ 一、背景与挑战​ 1.1 负载扰动补偿的痛点与传统控制局限​ 1.1.1 应用场景与核心指标​ 1.1.2 传统PI控制的缺陷​ 1.2 DOB负载扰动补偿的核心优势​ 1.3 设计目标​ 二、系…...

避坑指南:Java Robot类在Windows/Linux下的兼容性问题及解决方案

Java Robot类跨平台避坑实战&#xff1a;Windows与Linux环境差异全解析 当你第一次尝试用Java Robot类实现自动化测试脚本时&#xff0c;可能会惊讶地发现&#xff1a;在Windows上运行完美的代码&#xff0c;放到Linux服务器上却莫名其妙报错。这不是你的代码问题&#xff0c;而…...

Pixel Epic部署指南:GPU显存监控+自动降级策略+OOM防护机制

Pixel Epic部署指南&#xff1a;GPU显存监控自动降级策略OOM防护机制 1. 像素史诗终端概述 Pixel Epic&#xff08;像素史诗&#xff09;是一款基于AgentCPM-Report大模型构建的研究报告辅助终端&#xff0c;将严肃的科研过程转化为富有游戏感的交互体验。与传统AI工具不同&a…...

双倍效率:在快马平台中融合chatgpt实现智能代码生成与即时调试

最近在开发过程中&#xff0c;我发现了一个能显著提升效率的工作方式&#xff1a;将ChatGPT的智能生成能力与InsCode(快马)平台的即时调试环境结合起来。这种组合让我在代码编写、问题排查和逻辑优化上都节省了大量时间&#xff0c;今天就来分享一下具体的使用体验。 自然语言…...

VS2019项目配置全解析:从附加库到包含目录的实战指南

1. VS2019项目配置基础概念解析 刚接触VS2019时&#xff0c;我完全被各种配置选项搞晕了。特别是当需要引入第三方库时&#xff0c;附加库、包含目录这些概念简直让人抓狂。记得第一次配置OpenCV项目&#xff0c;光是让编译器找到头文件就折腾了大半天。后来才发现&#xff0c;…...

CosyVoice部署实战:从零到一搭建你的AI语音合成环境

1. 环境准备&#xff1a;打造AI语音合成的温床 第一次接触CosyVoice时&#xff0c;我对着官方文档发呆了半小时——那些密密麻麻的命令行像天书一样。后来才发现&#xff0c;搭建AI语音合成环境就像组装乐高积木&#xff0c;只要按步骤拼接关键部件就能成功。我们先从最基础的系…...

开源音乐解锁工具:浏览器端全平台音频解密解决方案

开源音乐解锁工具&#xff1a;浏览器端全平台音频解密解决方案 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https://…...

FreeRTOS实战指南:从定时器、中断到系统调优的进阶之路

1. FreeRTOS定时器实战&#xff1a;从基础到高级应用 在嵌入式系统中&#xff0c;定时器是实现精确时序控制的核心组件。FreeRTOS提供的软件定时器功能&#xff0c;比硬件定时器更加灵活易用。我曾在智能家居项目中用FreeRTOS定时器实现过温湿度传感器的周期性采集&#xff0c…...