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

Java核心: JarIndex的使用

在讲解Java类加载器的时候,我们发现URLClassLoader加载类或资源时通过访问ClassPath下的每一个路径,来确定类是否存在的,假设我们执行的命令是这样的

java -classpath D:\DiveInSpring\target\classes;C:\lib\spring-expression.jar;C:\lib\spring-boot-loader.jar  com.keyniu.dis.cl.TestLoad

如果我们代码里使用了org.springframework.boot.loader.launch.Archive,我们的类加载器会依次尝试在每个ClassPath下每个元素

  1. D:\DiveInSpring\target\classes,查找org/springframework/boot/loader/launch/Archive.class
  2. C:\lib\spring-expression.jar,查找org/springframework/boot/loader/launch/Archive.class
  3. C:\lib\spring-boot-loader.jar,查找org/springframework/boot/loader/launch/Archive.class

一个复杂的大型项目依赖几十个上百个第三方jar是很常见的,总是这么查找显然是极其低效的。改善这类低效的顺序查找的方法,最常见的就是创建索引,就像MySQL为表建立索引,Java提供了JarIndex用来表示对Jar文件的索引。

1. 查看索引

使用jar命令打包的时候,如果需要建立索引,会创建一个META-INF/INDEX.LIST文件,我们来看看这个文件的结构

  1. 在开头指定JarIndex的版本,独立一段,段和段之间用空行分隔
  2. 每个jar文件独立一段,下面跟踪这个jar下的目录(包)

这是TestJarIndex-1.0-SNAPSHOT.jar是我们的应用代码,lib/commons-lang3-3.12.0.jar是我们的第三方依赖

JarIndex-Version: 1.0TestJarIndex-1.0-SNAPSHOT.jar
META-INF
META-INF/maven
META-INF/maven/org.keyniu
META-INF/maven/org.keyniu/TestJarIndex
org
org/keyniulib/commons-lang3-3.12.0.jar
...
org
org/apache
org/apache/commons
org/apache/commons/lang3
org/apache/commons/lang3/arch

2. 构建索引

执行jar打包时默认并不会创建META-INF/INDEX.LIST文件,我们需要在jar命令后添加-i选项

jar cvf TestJarIndex-1.0-SNAPSHOT.jar -i -C path/to/classes .

企业级应用中我们基本不可能使用原始的jar命令来打包,所以这里我们将重点放在Maven上。maven-jar-plugin插件通过index标签来支持-i选项

  1. index=true,生成META-INF/INDEX.LIST文件
  2. addClassPath=true,生成MANIFEST.MF的Class-Path属性,同时INDEX.LIST包含第三方jar的索引
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.2.0</version><configuration><archive><index>true</index>                        <!-- 添加 jar -i选项 --><manifest><addClasspath>true</addClasspath> <!--MANIFEST.MF添加Class-Path属性,INDEX.LIST包含第3方依赖--><classpathPrefix>lib/</classpathPrefix> <!-- 第3方jar的路径前缀 --><mainClass>com.keyniu.Main</mainClass></manifest></archive></configuration></plugin></plugins>
</build>

生成的结果就是我们上一节查看索引展示的内容,接下来我们来看看我们怎么利用META-INF/INDEX.LIST来加快查找过程。

3. 使用索引

JarIndex定义在java.base/jdk.internal.util.jar中,要想正常使用,需要的IDEA的Run Configuration中先做模块导出

在Maven的编译插件中,做同样的导出

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><fork>true</fork><compilerArgs><arg>--add-exports</arg><arg>java.base/jdk.internal.util.jar=ALL-UNNAMED</arg></compilerArgs></configuration>
</plugin>
1. 核心API

现在我们可以正常的使用JarIndex了,JarIndex的核心方法只有这6个,分别是:

  1. read/write分别用来读取和写入INDEX.LIST文件的内容
  2. merge用于将另一个JarIndex的内容合并进当前JarIndex
  3. add用于将一个类/包和指定jar文件名关联
  4. getJarFiles用于获取JarIndex关联的所有jar文件名,即INDEX.LIST出现的所用jar文件名

2. 构建JarIndex

通过JarFile创建JarIndex对象的实例

public static void main(String[] args) throws IOException {String jarFileName = "D:\\Workspace\\TestJarIndex\\target\\TestJarIndex-1.0-SNAPSHOT.jar";String className = "org/keyniu/Main.class";JarFile jarFile = new JarFile(jarFileName);Manifest manifest = jarFile.getManifest();JarIndex jarIndex = JarIndex.getJarIndex(jarFile);
}
3. 输出INDEX.LIST

现在我们已经有JarIndex实例了,要输出INDEX.LIST只需要调用JarIndex.write(OutputStream),这里我们将它输出到控制台

4. 输出关联Jar名称

通过JarIndex.getJarFiles()获取所有关联的jar名称

5. 读取类所属的Jar

通过JarIndex.get(className)获取这个类所属的jar,这个方法才是我们最关心的核心方法。

相关文章:

Java核心: JarIndex的使用

在讲解Java类加载器的时候&#xff0c;我们发现URLClassLoader加载类或资源时通过访问ClassPath下的每一个路径&#xff0c;来确定类是否存在的&#xff0c;假设我们执行的命令是这样的 java -classpath D:\DiveInSpring\target\classes;C:\lib\spring-expression.jar;C:\lib\…...

1052 卖个萌(测试点1,2)

solution 想要输出\需要用\\才能输出&#xff0c;即 cout << "Are you kidding me? \\/" << endl;测试点1&#xff0c;2&#xff1a;输入序号小于1的非法情况 #include<iostream> #include<string> #include<map> using namespace…...

Vue 3与ESLint、Prettier:构建规范化的前端开发环境

title: Vue 3与ESLint、Prettier&#xff1a;构建规范化的前端开发环境 date: 2024/6/11 updated: 2024/6/11 publisher: cmdragon excerpt: 这篇文章介绍了如何在Vue 3项目中配置ESLint和Prettier以统一代码风格&#xff0c;实现代码规范性与可读性的提升。通过设置规则、解…...

npm安装依赖过慢

今天在使用npm安装taro框架的依赖时&#xff0c;速度慢到吐血&#xff0c;使用了淘宝镜像源依然很慢&#xff0c;安装一个多小时没反应&#xff0c;最后清理了缓存再次安装速度就快很多了&#xff0c;因此解决方法大致有两种&#xff1a; 使用淘宝镜像源 原域名&#xff1a; ht…...

计算机毕业设计 | SpringBoot+vue的教务管理系统

1&#xff0c;绪论 1.1 项目背景 在这个资讯高度发展的时代&#xff0c;资讯管理变革已经是一个更为宽泛、更为全面的潮流。为了保证中国的可持续发展&#xff0c;随着信息化技术的不断进步&#xff0c;教务管理体系也在不断完善。与此同时&#xff0c;伴随着信息化的飞速发展…...

深入探索深度学习的验证集:必要还是可选?

深入探索深度学习的验证集&#xff1a;必要还是可选&#xff1f; 在深度学习项目的设计和实施过程中&#xff0c;数据通常被划分为训练集、测试集&#xff0c;以及有时的验证集。尽管在一些研究中&#xff0c;我们可能看到只有训练集和测试集被使用&#xff0c;验证集的作用及…...

初识C++ · 反向迭代器简介

目录 前言 反向迭代器的实现 前言 继模拟实现了list和vector之后&#xff0c;我们对迭代器的印象也是加深了许多&#xff0c;但是我们实现的都是正向迭代器&#xff0c;还没有实现反向迭代器&#xff0c;那么为什么迟迟不实现呢&#xff1f;因为难吗&#xff1f;实际上还好。…...

fastapi学习前置知识点

前置知识点 FastApi&#xff1a;一个用于构建API的现代、快速&#xff08;高性能&#xff09;的web框架。 FastApi是建立在Pydantic和Starlette基础上&#xff0c;Pydantic是一个基于Python类型提示来定义数据验证、序列化和文档的库。Starlette是一种轻量级的ASGI框架/工具包…...

机器学习常见知识点 1:Baggin集成学习技术和随机森林

文章目录 1、集成学习a.BaggingBagging的工作原理1. 自助采样&#xff08;Bootstrap Sampling&#xff09;2. 训练多个基学习器3. 聚合预测 Bagging的优点Bagging的缺点应用场景 b.Boosting 2、决策树3、随机森林随机森林的核心概念1. 集成学习2. 决策树 构建随机森林的步骤1. …...

容器(Docker)安装

centos安装Docker sudo yum remove docker* sudo yum install -y yum-utils#配置docker的yum地址 sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#安装指定版本 - 可以根据实际安装版本 sudo yum install -y docke…...

前端JS必用工具【js-tool-big-box】学习,获取当前浏览器向上滚动还是向下滚动,获取当前距离顶部和底部的距离

这一小节&#xff0c;我们说一下 js-tool-big-box 添加的最新工具方法&#xff0c;在日常前端开发工作中&#xff0c;如果网页很长&#xff0c;我们就需要获取当前浏览器是在向上滚动&#xff0c;还是向下滚动。如果向上滚动&#xff0c;滚动到0的时候呢&#xff0c;需要做一些…...

【python】flask 框架

python flask 框架 flask是一个轻量级的python后端框架 (Django, tornado, flask) 官网&#xff1a;欢迎来到 Flask 的世界 — Flask中文文档(3.0.x) 安装&#xff1a;pip install Flask -i https://pypi.douban.com 常识&#xff1a; http,默认端口号为80; https,默认端口号…...

Word中插入Mathtype右编号,调整公式与编号的位置

当你已经将mathtype内置于word后&#xff0c;可以使用右编号快速插入公式 但是往往会出现公式和编号出现的位置或之间的距离不合适 比如我在双栏下插入公式&#xff0c;会发现插入的公式与编号是适用于单栏的 解决办法&#xff1a; 开始->样式->MTDisplayLquation -&g…...

基于【Lama Cleaner】一键秒去水印,轻松移除不想要的内容!

一、项目背景 革命性的AI图像编辑技术,让您的图片焕然一新!无论水印、logo、不想要的人物或物体,都能被神奇地移除,只留下纯净的画面。操作简单,效果出众,给你全新的视觉体验。开启图像编辑新纪元,尽在掌控! 利用去水印开源工具Lama Cleaner对照片中"杂质"进行去除…...

VMware Workstation Ubuntu server 24 (Linux) 磁盘扩容 挂载硬盘

1 Ubuntu server 关机,新增加磁盘 2 启动ubuntu虚拟机,分区和挂载磁盘 sudo fdisk /dev/sdb #查看磁盘UUID sudo blkid #创建挂载目录 sudo mkdir /mnt/data # sudo vi /etc/fstab /dev/disk/by-uuid/0b440ed0-b28b-4756-beeb-10c585e3d101 /mnt/data ext4 defaults 0 1 #加…...

表的设计与查询

目录 一、表的设计 1.第一范式&#xff08;一对一&#xff09; 定义&#xff1a; 示例&#xff1a; 2.第二范式&#xff08;一对多&#xff09; 定义&#xff1a; 要求&#xff1a; 示例&#xff1a; 3.第三范式&#xff08;多对多&#xff09; 定义&#xff1a; 要求…...

【react】如何合理使用useEffect

useEffect 是 React Hooks API 的一部分,它允许你在函数组件中执行副作用操作,比如数据获取、订阅或者手动更改 DOM。合理使用 useEffect 可以帮助你管理组件的生命周期行为,同时避免不必要的渲染和性能问题。以下是一些关于如何合理使用 useEffect 的建议: 明确依赖项: 当…...

计算机专业英语Computer English

计算机专业英语 Computer English 高等学校计算机英语教材 Contents 目录 Part One Computer hardware and software 计算机硬件和软件----------盖金曙 生家峰 Unit 1 the History of Computers计算机的历史 Unit 2 Computer System计算机系统 Unit 3 Di…...

目前比较好用的LabVIEW架构及其选择

LabVIEW提供了多种架构供开发者选择&#xff0c;以满足不同类型项目的需求。选择合适的架构不仅可以提高开发效率&#xff0c;还能确保项目的稳定性和可维护性。本文将介绍几种常用的LabVIEW架构&#xff0c;并根据不同项目需求和个人习惯提供选择建议。 常用LabVIEW架构 1. …...

CSS之块浮动

在盒子模型的基础上就可以对网页进行设计 不知道盒子模型的可以看前面关于盒子模型的内容 而普通的网页设计具有一定的原始规律,这个原始规律就是文档流 文档流 标签在网页二维平面内默认的一种排序方式,块级标签不管怎么设置都会占一行,而同一行不能放置两个块级标签 行级…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...