java 溯本求源之基础(七)之 jar(上篇)

        这个命令一些相关的知识点很重要!很重要!很重要!重要的事情说三遍,再说这个工具之前我们先把相关东西一口气说完

1.类是如何加载的

1.1类加载的顺序:
Bootstrap classes:

        这个我们更可以理解为引导类,就像计算机一样我们电脑开机,他启动有一个bios去找引导扇区(这里只是类比,很多过程肯定不一样的),去启动,这个也是一样的,那么在java中bootstarp都在那里呢,其实就是jre下面的lib目录

Extension classes(Installed extensions):

        其实这个我们之前在介绍 javac -Djava.ext.dirs=*directories*时就简单说过了,今天再次提及一下,由作者抛砖引玉,并且使用一下官网的图片。首先任何一组包或类都可以很容易地扮演扩展的角色。将一组类转换为扩展的第一步是将它们捆绑在一个JAR文件中,完成后,您可以通过两种方式将软件转换为扩展:

        a.通过将JAR文件放置在Java运行时环境的目录结构中的特殊位置(其实就是/ext下),在这种情况下,它被称为已安装的扩展。那么这个是什么,目录是什么,官网中的目录结构是这样的:

        额外需要注意的是从Java 6开始,扩展JAR文件也可以放置在独立于任何特定JRE的位置,这样系统上安装的所有JRE都可以共享扩展。在Java 6之前,Java .ext.dirs的值引用单个目录,但在Java 6中,它是一个目录列表(如CLASSPATH),指定搜索扩展的位置。路径的第一个元素始终是JRE的lib/ext目录。第二个元素是JRE外部的目录。另一个位置允许一次安装扩展JAR文件,并由该系统上安装的几个JRE使用。

        b.通过以指定的方式从另一个JAR文件的清单中引用JAR文件,在这种情况下,它被称为下载扩展。该方式就是我们在使用 javac -Djava.ext.dirs的方式。

Class Path(类路径 include user classes)

        用户类是由开发人员和第三方定义的类,它们不利用扩展机制。我们可以使用命令行上的-classpath选项(首选)或CLASSPATH环境变量来标识这些类的位置。

2.jar命令使用

2.1 jar命令简述

        jar命令是一个通用的归档和压缩工具,基于ZIP和ZLIB压缩格式。但是,jar命令主要用于将Java小程序或应用程序打包到单个归档文件中。当小程序或应用程序的组件(文件、图像和声音)组合成单个归档文件时,它们可以在单个HTTP事务中由Java代理(例如浏览器)下载,而不需要为每个组件建立新的连接。这极大地提高了下载时间。jar命令还可以压缩文件,这进一步缩短了下载时间。jar命令还允许小程序作者对文件中的单个条目进行签名,以便对它们的来源进行身份验证。无论是否压缩,JAR文件都可以用作类路径入口。

        jar命令的语法类似于tar命令的语法。它有几个操作模式,由一个强制操作参数定义。其他参数要么是修改操作行为的选项,要么是执行操作所需的操作数。

2.2参数介绍

        当我们在使用jar命令的时候,可以使用一些参数。以下是一部分的介绍

2.2.1必须指定的参数

        c,i,t,u,x 这个是我们在使用这个命令的时候必须指定的参数,也就是2.1中提到的一些指定命令,我们简单介绍一些这些的使用

  • c

    创建一个新的JAR归档文件。

  • i

    为JAR存档生成索引信息。

  • t

    列出JAR归档文件的内容。

  • u

    更新JAR存档。

  • x

    从JAR存档中提取文件。

2.2.2 自定义选项
        2.3.2.1 -e参数

        简单来说是用来覆盖原有 manifest文件中的 `Main-Class 属性的,注意是覆盖,而不是增加,那么就会有人问这个参数这个文件都是什么玩意儿,听我娓娓道来,manifest在我们打包过程中是非常常见的,只不过我们不一定会注意到,比如常见的我们一个springboot项目,在使用mvn clean package的时候,他就会出现一个jar包,当我们使用压缩工具打开时会有一个META-INF的文件夹,这个文件夹下面就有一个MANIFEST.MF的文件,就是我们说的这个东西,这个东西里面有很多值,一会儿会简单介绍下,但是我们先说这个值。

        以springboot项目打包为例,笔者简单看了一下代码,在打包过程中,使用的是spring-boot-maven-plugin插件,这个插件中主要使用的则是spring-boot-loader-tools模块,在代码中使用的则是org.springframework.boot.loader.JarLauncher作为的Main-Class的值。一下是两个截图,有兴趣的朋友可以去看一下,我这里不过多赘述了,这个就是jarLauncher的实现

那么这个参数如何使用:

jar cfe output.jar MainClass input-files
  • MainClass 是包含 main 方法的类的名称,它将作为 JAR 文件的入口点。这个类名应该使用完全限定名(包括包名)。
  • input-files 是要包含在 JAR 文件中的文件和目录的列表。这通常包括编译后的 .class 文件和其他资源文件。

   为什么这个MainClass笔者会说这么多,我碰到的场景大概有两种,在我们使用java -jar 启动的时候会有找不到启动类的情况,那么很有可能就是这个不对了,1是我们可能在pom(以maven为例)设置了一些条件,可能打出来了不同的jar,此时我们要注意区分,2是有的时候去做物理机这种的更新,我们每次可能不需要全量部署,或者某些客户会有要求,上传的包不够,那么就可以修改我们的加载器,轻量化部署

扩展:

        MANIFEST.MF 文件是 Java 打包工具(如 jar、war、ear 等)中必须存在的一个文件,用于描述打包文件的元信息。它的主要作用有以下两个方面:

1.指定打包文件中的主类

        MANIFEST.MF 文件中的 Main-Class 属性可以指定打包文件中的主类,这个主类将会在运行时被启动。当我们使用 java -jar 命令运行一个 JAR 文件时,Java 运行时会读取 MANIFEST.MF 文件,找到 Main-Class 属性指定的类,并执行该类的 main() 方法。

2.存储打包文件的元信息

        MANIFEST.MF 文件中还可以包含其他自定义属性,用于存储打包文件的元信息。例如,可以指定打包文件的版本号、作者、描述信息等。这些属性可以在运行时被读取,以提供更多的应用程序信息。

3.MANIFEST.MF有哪些配置项

1.Manifest-Version

指定 MANIFEST.MF 文件的版本号。例如 Manifest-Version: 1.0

2.Main-Class 指定打包文件的主类。

例如 Main-Class: com.example.MyMainClass

3.Class-Path 指定该 JAR 文件的类路径,以便在运行时加载其他类。

例如: Class-Path: lib/other.jar lib/some.jar

4.Created-By 指定生成该 JAR 文件的工具和版本号。

例如: Created-By: Apache Maven 3.6.3

5.Implementation-Title 指定该 JAR 文件的实现标题。

例如: Implementation-Title: My Application

6.Implementation-Version 指定该 JAR 文件的实现版本。

例如 Implementation-Version: 1.0.0-SNAPSHOT

7.Implementation-Vendor 指定该 JAR 文件的实现厂商。

例如: Implementation-Vendor: Acme Corporation

8.Implementation-Vendor-Id 指定该 JAR 文件的实现厂商 ID。

例如: Implementation-Vendor-Id: com.acme

9.Specification-Title 指定该 JAR 文件的规范标题。

例如: Specification-Title: My Application API

10.Specification-Version 指定该 JAR 文件的规范版本。

例如 Specification-Version: 1.0.0

11.Specification-Vendor 指定该 JAR 文件的规范厂商。

例如 Specification-Vendor: Acme Corporation

12.Sealed 指定该 JAR 文件是否被封闭,即是否允许其他 JAR 文件修改该 JAR 文件中的类文件。

例如: Sealed: true

在 Java 中,MANIFEST.MF 文件通常被 Java 虚拟机(JVM)或相关的工具读取和解析。

        例如,当我们在命令行使用 "java -jar" 命令运行一个打包成 JAR 文件的 Java 应用程序时,JVM 会读取 JAR 文件中的 MANIFEST.MF 文件来确定应用程序的主类,从而启动应用程序。 此外,也有许多其他的工具和库可以读取和解析 MANIFEST.MF 文件,

        例如 Maven 和 Gradle 等构建工具,以及一些用于操作 JAR 文件的 Java 库,如 Java Archive (JAR) API 等。这些工具和库通常会使用 Java 类库中的 java.util.jar.Manifest 类来解析 MANIFEST.MF 文件,并将其转换为 Java 对象,以便于后续的操作和使用

 更多可以参照官网https://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day21代码随想录(1刷) 二叉树

530. 二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数,其数值等于两值之差的绝对值。 示例 1: 输入:root [4,2,6,1,3] 输出:1示例 2&#xff1…

【漏洞复现】通天星CMSV6-inspect_file-upload文件上传漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

誉天云计算学员分享丨备考方法:按难度分配时间

大家好,我是誉天的肖同学,我在2024年3月20 日的云计算HCIE3.0考试已顺利通过! 备考准备 在9月初开始准备的笔试,过了之后就在10月初进的备考群,刚进来就先把群公告,新手村的文件看完,了解到了实…

500W-600W-700W-800W厚膜电阻器

缓冲器和滤波器应用的理想选择 紧凑型外壳电阻器,具有良好的热传导 必须与外部散热片一起使用模压外壳,可承受强大的环境条件 优化结构,高导热大蠕变距离所有内部电气连接都是焊接的 EAK300W厚膜电阻 一般泛规格,以300W为例 阻…

Android Handler使用介绍

Android 中的 Handler 是用来和线程通信的重要工具。它主要用于在后台线程中执行任务,并将结果传递回主线程以更新用户界面。 一、基本概念 线程间通信: Android 应用通常具有主线程(也称为 UI 线程)和后台线程。Handler 允许您从…

标题:Three.js:开源的JavaScript 3D库探索与实践

摘要: 本文将深入探讨Three.js,一个开源的JavaScript 3D库。Three.js提供了一种简单易用的方式来创建和显示3D图形,打破了Web开发和3D图形之间的障碍。本文将介绍Three.js的特性和用法,以及如何通过简单的示例来展示其功能。 一、…

Go语言学习Day2:注释与变量

名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 1、注释①为什么要写注释?②单行注释…

本周四Techtalk技术交流社区邀请吕海波老师为大家带来精彩技术分享

欢迎您关注我的公众号【尚雷的驿站】 **************************************************************************** 公众号:尚雷的驿站 CSDN :https://blog.csdn.net/shlei5580 墨天轮:https://www.modb.pro/u/2436 PGFans:ht…

leetCode刷题 18. 删除链表的倒数第 N 个结点

目录 1. 思路 2. 解题方法 3. 复杂度 4. Code 题目: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入&…

【二叉树】Leetcode 94. 二叉树的中序遍历【简单】

二叉树的中序遍历 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2] 解题思路 中序遍历是一种二叉树遍历方式,按照“左根右”的顺序遍历二叉树节点。 1、递归…

43 带 fixed 列的 el-table 不兼容于 sortablejs

前言 这是一个基于 sortablejs 来实现的 el-table 的拖拽功能的基础实现 然后 这个过程中遇到的一个比较特殊的问题是, 关于 el-table-column 的 fixed 的属性, 对于 sortablejs 这边来定位目标选择列 影响的一个问题 在基础的用例中, 使用 “.el-table__body-wrapper tbo…

免费redis可视化工具windows/mac都可以使用,开源免费

官方地址:RedisInsight | The Best Redis GUI github开源地址:GitHub - RedisInsight/RedisDesktopManager Redis Desktop Manager – Redis可视化管理工具、redis图形化管理工具、redis可视化客户端、redis集群管理工具。 官方下载方式 滚动到页面底…

考研数学一——概率论真题——自我总结题型整理(总分393)

系列文章目录 终于考完研了,本人考的是南京航空航天大学的仪器科学与技术,英一数一电路,以下是成绩单: 平时习惯整理自己的学习体系,以下是一个记录。 其实,每个人都应该训练,看到某一类题目…

怎么开发水果店小程序_指尖上的新鲜果园

水果店小程序:指尖上的新鲜果园,让生活更甜美! 在这个快节奏的现代生活中,人们对于便捷、高效的生活方式有着越来越高的追求。购物也不例外,我们都在寻找着一种更加轻松、快捷的购物方式。而水果店小程序,…

javaSwing连连看游戏

一、简介 基于java的连连看游戏设计和实现,基本功能包括:消除模块,重新开始模块,刷新模块,选择难度模块,计时模块。本系统结构如下: (1)消除模块: 完成连连…

Adobe Illustrator和Photoshop哪个难学?另一款好用设计软件上位!

当设计开始时,几乎没有人不知道。 Adobe 公司的两大设计软件:Adobe Illustrator 和 Photoshop。虽然 Adobe Illustrator和 Photoshop 很有名,有一定设计经验的设计师在前期探索使用后可以对 Adobe Illustrator和 Photoshop 的使用差异有一个大…

蓝桥杯JAVA-试题-基础练习

一、十六进制转八进制 资源限制 内存限制:512.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述   给定n个十六进制正整数,输出它们对应的八进制数。输入格式   输入的第一行为一个正整…

AI老人跌倒监测报警摄像机

AI老人跌倒监测报警摄像机是一种基于人工智能技术的智能监控设备,专门用于监测老年人的跌倒情况并提供实时报警功能,以及时处理紧急情况,保障老人安全。这种摄像机利用先进的AI算法和深度学习技术,能够实时监测老人的行为&#xf…

Linux下的I/O模型

目录 一、什么是IO? 二、IO操作的两个阶段 三、五种I/O模型 1、阻塞I/O(blocking I/O) 2、非阻塞I/O(non-blocking I/O) 3、多路复用I/O(multiplexing I/O) 4、信号驱动I/O(signal-driven I/O) 5、异步I/O(asynchronous I/O) 四、五种I/O模型比较 一、什么…

ElasticSearch启动报错:Exception in thread “main“ SettingsException

Exception in thread "main" SettingsException[Failed to load settings from [elasticsearch.yml]]; nested: ParsingException[Failed to parse object: expecting token of type [START_OBJECT] but found [VALUE_STRING]]; 这个报错说明elasticsearch.yml这个配…