总结:利用JDK原生命令,制作可执行jar包与依赖jar包

news2024/11/17 5:53:53

总结:利用JDK原生命令,制作可执行jar包与依赖jar包

  • 一·什么是jar包?
  • 二·制作jar包的工具:JDK原生自带的jar命令
    • (1)jar命令注意事项:
    • (2)jar包清单文件创建示例:
    • (3)jar命令的运用详情链接地址:
  • 三·执行jar包的命令方式:JDK原生自带java命令
  • 四·制作依赖jar包:清单文件视情况自定义创建
    • 1.需要打成jar包的class文件,没有依赖外部jar包,也没有手动创建清单文件。制作示例如下:
      • (1)先创建两个类:Hello、Hello2
      • (2)将java文件编译为class文件
      • (3)打开控制台,进入顶层包名所在目录下面
      • (4)使用jdk自带的jar命令,进行打包
      • (5)将jar包解压缩查看层次结构
      • (6)将jar包拿到其他项目当作依赖包使用:成功!
    • 2.需要打成jar包的class文件,有依赖外部jar包,则必须手动创建清单文件MANIFEST.MF,制作示例如下
      • (1)创建一个Hello3类
      • (2)编译为class文件
      • (3)手动创建清单文件MANIFEST.MF,位置自定义。清单文件中必须存在Class-Path属性,指明该包里面的类依赖外部jar包的相对路径(相对主jar包所在目录),多个jar包路径就空格隔开。该路径也可以自定义设置,但也不建议太随意
        • (3-1)Class-Path属性后面的所有jar包相对路径,都不能从斜杠“/”开始
        • (3-2)如果清单文件中存在多个Class-Path属性值,则最后生成jar包里面的清单文件只会保留最下面出现的Class-Path属性值,上面的自动忽略掉
        • (3-3)Class-Path属性后面的所有jar包相对路径,是相对于主jar包(即:你最终代码文件生成jar包)所放置目录的。在主jar包所在目录后面,继续拼接上Class-Path属性指定的相对路径,这样形成的路径才是完整的jar包引入路径。
        • (3-4)因此外部jar包没有必要在打包的时候又封装进去,即使你封装进去,也不会生效的。因为打包之后,里面封装的各种文件所在目录永远是主jar包所在目录的子目录,这样虚拟机就永远找不到jar包加载路径。
        • (3-5)一旦存在外部jar包依赖,该jar就不能独立使用,需要结合依赖的外部jar包且外部jar包必须存放在Class-Path属性指定的相对目录下面,这样才能正确使用,否则就容易报找不到具体类异常
        • (3-6)MANIFEST.MF文件,第一行不可以是空行( 第一行的行前不可以有空行),行与行之间不能有空行,每行的行尾不可以有空格
        • (3-7)MANIFEST.MF文件,最后一行必须是空行(在输完你的内容后加一个回车就OK)
        • (3-8)MANIFEST.MF文件,分号后面一定要有空格:
      • (4)打开控制台,进入顶层包名所在目录下面
      • (5)使用jdk自带的jar命令,进行打包
      • (6)将jar包解压缩查看层次结构
      • (7)将jar包拿到其他项目当作依赖包使用,注意在指定目录下引入其他jar包:成功!
  • 五·制作可执行jar包:清单文件必须自定义创建
    • (1)先创建Hello4类
    • (2)编译成class文件
      • (3)手动创建清单文件MANIFEST.MF,位置自定义。清单文件中必须存在Main-Class属性,指明主程序类路径,从顶层包名开始
        • (3-1)MANIFEST.MF文件,第一行不可以是空行( 第一行的行前不可以有空行),行与行之间不能有空行,每行的行尾不可以有空格
        • (3-2)MANIFEST.MF文件,最后一行必须是空行(在输完你的内容后加一个回车就OK)
        • (3-3)MANIFEST.MF文件,分号后面一定要有空格:
      • (4)打开控制台,进入顶层包名所在目录下面
      • (5)使用jdk自带的jar命令,进行打包
      • (6)将jar包解压缩查看层次结构
      • (7)使用JDK原生自带命令,执行jar包:成功!

一·什么是jar包?

JAR(Java Archive)是Java开发中常用的一种文件格式。它是一种归档文件,用于将多个Java类文件、资源文件和元数据打包成一个单独的文件。JAR文件通常用于分发和部署Java应用程序和库。 
 
JAR包可以包含编译后的Java类文件(.class文件)、配置文件、图像、音频文件等资源,以及描述这些文件的元数据信息。JAR包还可以包含清单文件(Manifest),用于指定JAR包的属性和配置信息。 
 
JAR包具有压缩功能,可以将多个文件压缩成一个较小的文件,以便更方便地传输和存储。它还提供了方便的类加载和资源访问机制,使得Java应用程序可以轻松地使用JAR包中的类和资源。 

综上所述:jar包就是将一系列Java开发文件压缩成归档包,方便代码文件管理、传输与部署等等

二·制作jar包的工具:JDK原生自带的jar命令

用法: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...

名词解释:   
{ctxui}:执行jar命令的必选参数,每次执行jar命令必须至少选择一个参数
[vfmn0PMe]:执行jar命令的可选项参数,每次执行jar命令可选可不选
[jar-file]:最终生成jar包输出路径及jar包名称
[manifest-file]:生成jar包使用的清单文件路径
[entry-point]:程序执行入口
[-C dir]:跳转到指定目录下面执行jar命令
files:需要打包文件所在目录路径

选项:
    -c  创建新档案
    -t  列出档案目录
    -x  从档案中提取指定的 (或所有) 文件
    -u  更新现有档案
    -v  在标准输出中生成详细输出
    -f  指定档案文件名
    -m  包含指定清单文件中的清单信息
    -n  创建新档案后执行 Pack200 规范化
    -e  为捆绑到可执行 jar 文件的独立应用程序
        指定应用程序入口点
    -0  仅存储; 不使用任何 ZIP 压缩
    -P  保留文件名中的前导 '/' (绝对路径)".." (父目录) 组件
    -M  不创建条目的清单文件
    -i  为指定的 jar 文件生成索引信息
    -C  更改为指定的目录并包含以下文件
    

(1)jar命令注意事项:

(1)如果任何文件为目录, 则对其进行递归处理。
(2)清单文件名, 档案文件名和入口点名称的指定顺序与'm', 'f''e' 标记的指定顺序相同。
(3)清单文件名一般就两种固定名称,不允许随意修改文件名称:MANIFEST.MF、manifest.txt


示例 1: 将当前目录下面的所有文件归档到一个名为 classes.jar 的档案中: 
       jar cvf classes.jar .
       
示例 2: 使用现有的清单文件 'mymanifest' 并将 foo/ 目录中的所有文件归档到 'classes.jar' 中: 
       jar cvfm classes.jar mymanifest -C foo/ .

(2)jar包清单文件创建示例:

Manifest-Version: 1.0
Created-By: 1.8.0_361 (Oracle Corporation)
Class-Path: lib/fastjson.jar lib/hello.jar
Main-Class: test.Hello

在这里插入图片描述

(3)jar命令的运用详情链接地址:

https://www.cnblogs.com/liyanbin/p/6088458.html

三·执行jar包的命令方式:JDK原生自带java命令

注意:需要该jar包的确可以执行才行,否则执行了命令也不生效

java -jar jar包路径

例如:java -jar /Users/ideal/Desktop/untitled-test/out/production/untitled-test/hello4.jar
java -jar ./hello2.jar

四·制作依赖jar包:清单文件视情况自定义创建

1.需要打成jar包的class文件,没有依赖外部jar包,也没有手动创建清单文件。制作示例如下:

(1)先创建两个类:Hello、Hello2

在这里插入图片描述
在这里插入图片描述

(2)将java文件编译为class文件

在这里插入图片描述

(3)打开控制台,进入顶层包名所在目录下面

在这里插入图片描述
在这里插入图片描述

(4)使用jdk自带的jar命令,进行打包

命令格式(参数具体详情看文章最上面介绍):
jar cvf/-cvf 自定义jar包名称 需要打包的class文件目录

例如本次示例:
(4-1)生成jar包时,自动生成一个默认清单文件:jar cvf hello.jar ./test
(4-2)生成jar包时,不生成一个默认清单文件:jar cvfM hello.jar ./test

(4-1)方式一:生成jar包时,自动生成一个默认清单文件:

jar cvf hello.jar ./test

在这里插入图片描述
(4-2)方式二:生成jar包时,不生成一个默认清单文件:

jar cvfM hello.jar ./test

在这里插入图片描述

(5)将jar包解压缩查看层次结构

(5-1)有默认清单文件的jar包
在这里插入图片描述
(5-2)无默认清单文件的jar包
在这里插入图片描述

(6)将jar包拿到其他项目当作依赖包使用:成功!

在这里插入图片描述

2.需要打成jar包的class文件,有依赖外部jar包,则必须手动创建清单文件MANIFEST.MF,制作示例如下

(1)创建一个Hello3类

在这里插入图片描述

(2)编译为class文件

在这里插入图片描述

(3)手动创建清单文件MANIFEST.MF,位置自定义。清单文件中必须存在Class-Path属性,指明该包里面的类依赖外部jar包的相对路径(相对主jar包所在目录),多个jar包路径就空格隔开。该路径也可以自定义设置,但也不建议太随意

(3-1)Class-Path属性后面的所有jar包相对路径,都不能从斜杠“/”开始
(3-2)如果清单文件中存在多个Class-Path属性值,则最后生成jar包里面的清单文件只会保留最下面出现的Class-Path属性值,上面的自动忽略掉
(3-3)Class-Path属性后面的所有jar包相对路径,是相对于主jar包(即:你最终代码文件生成jar包)所放置目录的。在主jar包所在目录后面,继续拼接上Class-Path属性指定的相对路径,这样形成的路径才是完整的jar包引入路径。
(3-4)因此外部jar包没有必要在打包的时候又封装进去,即使你封装进去,也不会生效的。因为打包之后,里面封装的各种文件所在目录永远是主jar包所在目录的子目录,这样虚拟机就永远找不到jar包加载路径。
(3-5)一旦存在外部jar包依赖,该jar就不能独立使用,需要结合依赖的外部jar包且外部jar包必须存放在Class-Path属性指定的相对目录下面,这样才能正确使用,否则就容易报找不到具体类异常
(3-6)MANIFEST.MF文件,第一行不可以是空行( 第一行的行前不可以有空行),行与行之间不能有空行,每行的行尾不可以有空格
(3-7)MANIFEST.MF文件,最后一行必须是空行(在输完你的内容后加一个回车就OK)
(3-8)MANIFEST.MF文件,分号后面一定要有空格:
key: value       在分号后面一定要写写一个空格

MANIFEST.MF文件内容示例

Manifest-Version: 1.0
Created-By: 1.8.0_361 (Oracle Corporation)
Class-Path: msdev/lmf/lib/fastjson.jar msdev/lmf/lib/hello.jar

在这里插入图片描述

(4)打开控制台,进入顶层包名所在目录下面

在这里插入图片描述

(5)使用jdk自带的jar命令,进行打包

jar cvfm hello3.jar /Users/ideal/Desktop/untitled-test/web/WEB-INF/MANIFEST.MF .

在这里插入图片描述

(6)将jar包解压缩查看层次结构

在这里插入图片描述

(7)将jar包拿到其他项目当作依赖包使用,注意在指定目录下引入其他jar包:成功!

在这里插入图片描述

五·制作可执行jar包:清单文件必须自定义创建

(1)先创建Hello4类

在这里插入图片描述

(2)编译成class文件

在这里插入图片描述

(3)手动创建清单文件MANIFEST.MF,位置自定义。清单文件中必须存在Main-Class属性,指明主程序类路径,从顶层包名开始

(3-1)MANIFEST.MF文件,第一行不可以是空行( 第一行的行前不可以有空行),行与行之间不能有空行,每行的行尾不可以有空格
(3-2)MANIFEST.MF文件,最后一行必须是空行(在输完你的内容后加一个回车就OK)
(3-3)MANIFEST.MF文件,分号后面一定要有空格:
key: value       在分号后面一定要写写一个空格

MANIFEST.MF文件内容示例

Manifest-Version: 1.0
Created-By: 1.8.0_361 (Oracle Corporation)
Main-Class: test.Hello4

在这里插入图片描述

(4)打开控制台,进入顶层包名所在目录下面

在这里插入图片描述

(5)使用jdk自带的jar命令,进行打包

jar cvfm hello4.jar /Users/ideal/Desktop/untitled-test/web/WEB-INF/MANIFEST.MF .

在这里插入图片描述

(6)将jar包解压缩查看层次结构

在这里插入图片描述

(7)使用JDK原生自带命令,执行jar包:成功!

java -jar ./hello4.jar

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

20231112_DNS详解

DNS是实现域名与IP地址的映射。 1.映射图2.DNS查找顺序图3.DNS分类和地址4.如何清除缓存 1.映射图 图片来源于http://egonlin.com/。林海峰老师课件 2.DNS查找顺序图 3.DNS分类和地址 4.如何清除缓存

winform+access数据库增删查改报表导出demo源码

C#winformaccess数据库增删查改报表导出demo源码设备管理的一个简单程序使用access数据库增删查改导出报表功能 OleDbConnection conn new OleDbConnection("Data Source" System.Windows.Forms.Application.StartupPath "\\config\\cinfor.mdb;ProviderMicr…

Java图像编程之:Graphics

一、概念介绍 1、Java图像编程的核心类 Java图像编程的核心类包括: BufferedImage:用于表示图像的类,可以进行像素级的操作。Image:表示图像的抽象类,是所有图像类的基类。ImageIcon:用于显示图像的类&a…

.net在使用存储过程中IN参数的拼接方案,使用Join()方法

有时候拼接SQL语句时&#xff0c;可能会需要将list中的元素都加上单引号&#xff0c;并以逗号分开&#xff0c;但是Join只能简单的分开&#xff0c;没有有单引号&#xff01; 1.第一种拼接方案 List<string> arrIds new List<string>(); arrIds.Add("aa&qu…

微软近日限制员工访问ChatGPT!

作者 | 撒鸿宇 据CNBC报道&#xff0c;在这周四的短时间内&#xff0c;微软的员工被禁止使用ChatGPT。 微软在其内部网站的更新中表示&#xff1a;“由于安全和数据问题&#xff0c;一些AI工具不再对员工开放。”据CNBC查证&#xff0c;他们看到了一张截图&#xff0c;该截图显…

[Go语言]SSTI从0到1

[Go语言]SSTI从0到1 1.Go-web基础及示例2.参数处理3.模版引擎3.1 text/template3.2 SSTI 4.[LineCTF2022]gotm1.题目源码2.WP 1.Go-web基础及示例 package main import ("fmt""net/http" ) func sayHello(w http.ResponseWriter, r *http.Request) { // 定…

发布订阅者模式(观察者模式)

目录 应用场景 1.结构 2.效果 3.代码 3.1.Main方法的类【ObserverPatternExample】 3.2.主题&#xff08;接口&#xff09;【Subject】 3.3.观察者&#xff08;接口&#xff09;【Observer】 3.4.主题&#xff08;实现类&#xff09;【ConcreteSubject】 3.5.观察者&a…

[工业自动化-16]:西门子S7-15xxx编程 - 软件编程 - 西门子仿真软件PLCSIM

目录 前言&#xff1a; 一、PLCSIM仿真软件 1.1 PLCSIM仿真软件基础版&#xff08;内嵌&#xff09; 1.2 PLCSIM仿真软件与PLCSIM仿真软件高级版的区别&#xff1f; 1.3 PLCSIM使用 前言&#xff1a; PLC集成开发环境是运行在Host主机上&#xff0c;Host主机与PLC可以通过…

外星人笔记本键盘USB协议逆向

前言 我朋友一台 dell g16 购买时直接安装了linux系统&#xff0c;但是linux上没有官方的键盘控制中心&#xff0c;所以无法控制键盘灯光&#xff0c;于是我就想着能不能逆向一下键盘的协议&#xff0c;然后自己写一个控制键盘灯光的程序。我自己的外星人笔记本是m16&#xff…

基恩士软件的基本指令(二)

目录 基础指令 输入输出常开常闭指令 “A软元件名称--装入快捷键” “O软元件名称--输出快捷键” “ALT回车--连线快捷键” “B软元件--常闭接点” “软元件“/”--切换常开/常闭接点状态” 上升沿下降沿指令 “P-软元件回车--上升沿输入方法” “F-软元件回车--下降沿输入…

logback异步日志打印阻塞工作线程

前言 最新做项目&#xff0c;发现一些历史遗留问题&#xff0c;典型的是日志打印的配置问题&#xff0c;其实都是些简单问题&#xff0c;但是往往简单问题引起严重的事故&#xff0c;比如日志打印阻塞工作线程&#xff0c;以logback和log4j2为例。logback实际上是springboot的…

通过SD卡给某摄像头植入可控程序

0x01. 摄像头卡刷初体验 最近研究了手上一台摄像头的sd卡刷机功能&#xff0c;该摄像头只支持fat32格式的sd卡&#xff0c;所以需要先把sd卡格式化为fat32&#xff0c;另外微软把fat32限制了最大容量32G&#xff0c;所以也只能用不大于32G的sd卡来刷机。 这里使用32G的sd卡来…

flutter逆向 ACTF native app

前言 算了一下好长时间没打过CTF了,前两天看到ACTF逆向有道flutter逆向题就过来玩玩啦,花了一个下午做完了.说来也巧,我给DASCTF十月赛出的逆向题其中一道也是flutter,不过那题我难度降的相当之低啦,不知道有多少人做出来了呢~ 还原函数名 flutter逆向的一大难点就是不知道l…

RGMII回环:IDDR+ODDR+差分接口

目录 一、实验内容二、原理解释三、程序1、顶层文件&#xff1a;2、子模块2.1 oddr模块2.2、iddr顶层模块2.3、iddr子模块 3、仿真4、注意5、下载工程及仿真 一、实验内容 1、通过IDDR和ODDR的方式完成RGMII协议&#xff1b; 2、外部接口使用OBUFDS、IBUFDS转换成差分接口&…

C++语言的广泛应用领域

目录 1. 系统级编程 2. 游戏开发 3. 嵌入式系统 4. 大数据处理 5. 金融和量化分析 6. 人工智能和机器学习 7. 网络和通信 结语 C是一种多范式编程语言&#xff0c;具有高性能、中级抽象能力和面向对象的特性。由Bjarne Stroustrup于1979年首次设计并实现&#xff0c;C在…

如何确定线程栈的基址?

起 很早之前&#xff0c;我遇到过几个与栈相关的问题&#xff0c;当时总结过几篇关于线程栈的文章&#xff0c;分别是 《栈大小可以怎么改&#xff1f;》、《栈局部变量优化探究&#xff0c;意外发现了 vs 的一个 bug &#xff1f;》、《栈又溢出了》、《有趣的异常》。在这几…

【fast2021论文导读】 Learning Cache Replacement with Cacheus

文章:Learning Cache Replacement with Cacheus 导读摘要: 机器学习的最新进展为解决计算系统中的经典问题开辟了新的、有吸引力的方法。对于存储系统,缓存替换是一个这样的问题,因为它对性能有巨大的影响。 本文第一个贡献,确定了与缓存相关的特征,特别是,四种工作负载…

C++基础(2)——类和对象

目录 1. 类的引入&#xff1a; 2. 类的定义&#xff1a; 2.1类的定义以及基本结构&#xff1a; 2.2 类的访问限定符&#xff1a; 3. 类的声明与定义的分离&#xff1a; 4. 类的实例化&#xff1a; 5. 类的大小计算&#xff1a; 1. 类的引入&#xff1a; 在数据结构系列的…

有源RS低通滤波

常用的滤波电路有无源滤波和有源滤波两大类。若滤波电路元件仅由无源元件&#xff08;电阻、电容、电感&#xff09;组成&#xff0c;则称为无源滤波电路。无源滤波的主要形式有电容滤波、电感滤波和复式滤波(包括倒L型、LC滤波、LCπ型滤波和RCπ型滤波等)。若滤波电路不仅有无…

【vue+el-upload+vue-cropper】vue图片上传,vue-cropper图片裁剪后上传

一. 先看效果演示 二. 图片上传 用的el-upload加el-image组件 html部分 <el-dialog> ...//无关代码已省略<div v-for"item in imgArr" :key"item.index"><span>{{ item.name }}</span><el-upload action"#" list-t…