命令行打jar包

news2024/11/8 21:28:33

命令行打jar包

  • 前言
  • jar --help
  • cvfm
  • MANIFEST.MF
  • 压入class文件

前言

每一个java开发者运行第一个java项目时都知道项目通常被打成jar包,这些jar包是由IDE工具打的,知其然不知其所以然。

jar --help

用help命令打印jar支持的所有参数,不做过多解读

jar --help
用法: jar [OPTION...] [ [--release VERSION] [-C dir] files] ...
jar 创建类和资源的档案, 并且可以处理档案中的
单个类或资源或者从档案中还原单个类或资源。

 示例:
 # 创建包含两个类文件的名为 classes.jar 的档案:
 jar --create --file classes.jar Foo.class Bar.class
 # 使用现有的清单创建档案, 其中包含 foo/ 中的所有文件:
 jar --create --file classes.jar --manifest mymanifest -C foo/ .
 # 创建模块化 jar 档案, 其中模块描述符位于
 # classes/module-info.class:
 jar --create --file foo.jar --main-class com.foo.Main --module-version 1.0
     -C foo/ classes resources
 # 将现有的非模块化 jar 更新为模块化 jar:
 jar --update --file foo.jar --main-class com.foo.Main --module-version 1.0
     -C foo/ module-info.class
 # 创建包含多个发行版的 jar, 并将一些文件放在 META-INF/versions/9 目录中:
 jar --create --file mr.jar -C foo classes --release 9 -C foo9 classes

要缩短或简化 jar 命令, 可以在单独的文本文件中指定参数,
并使用 @ 符号作为前缀将此文件传递给 jar 命令。

 示例:
 # 从文件 classes.list 读取附加选项和类文件列表
 jar --create --file my.jar @classes.list


 主操作模式:

  -c, --create               创建档案
  -i, --generate-index=FILE  为指定的 jar 档案生成
                             索引信息
  -t, --list                 列出档案的目录
  -u, --update               更新现有 jar 档案
  -x, --extract              从档案中提取指定的 (或全部) 文件
  -d, --describe-module      输出模块描述符或自动模块名称
      --validate             Validate the contents of the jar archive. This option
                             will validate that the API exported by a multi-release
                             jar archive is consistent across all different release
                             versions.

 在任意模式下有效的操作修饰符:

  -C DIR                     更改为指定的目录并包含
                             以下文件
  -f, --file=FILE            档案文件名。省略时, 基于操作
                             使用 stdin 或 stdout
      --release VERSION      将下面的所有文件都放在
                             jar 的版本化目录中 (即 META-INF/versions/VERSION/)
  -v, --verbose              在标准输出中生成详细输出

 在创建和更新模式下有效的操作修饰符:

  -e, --main-class=CLASSNAME 捆绑到模块化或可执行
                             jar 档案的独立应用程序
                             的应用程序入口点
  -m, --manifest=FILE        包含指定清单文件中的
                             清单信息
  -M, --no-manifest          不为条目创建清单文件
      --module-version=VERSION    创建模块化 jar 或更新
                             非模块化 jar 时的模块版本
      --hash-modules=PATTERN 计算和记录模块的散列,
                             这些模块按指定模式匹配并直接或
                             间接依赖于所创建的模块化 jar 或
                             所更新的非模块化 jar
  -p, --module-path          模块被依赖对象的位置, 用于生成
                             散列

 只在创建, 更新和生成索引模式下有效的操作修饰符:

  -0, --no-compress          仅存储; 不使用 ZIP 压缩
      --date=TIMESTAMP       The timestamp in ISO-8601 extended offset date-time with
                             optional time-zone format, to use for the timestamps of
                             entries, e.g. "2022-02-12T12:30:00-05:00"

 其他选项:

  -?, -h, --help[:compat]    提供此帮助,也可以选择性地提供兼容性帮助
      --help-extra           提供额外选项的帮助
      --version              输出程序版本

 如果模块描述符 'module-info.class' 位于指定目录的
 根目录中, 或者位于 jar 档案本身的根目录中, 则
 该档案是一个模块化 jar。以下操作只在创建模块化 jar,
 或更新现有的非模块化 jar 时有效: '--module-version',
 '--hash-modules''--module-path'。

 如果为长选项提供了必需参数或可选参数, 则它们对于
 任何对应的短选项也是必需或可选的。

cvfm

既然要打成jar包,

  1. 那么就要创建jar包由help可知jar -c xx.jar
  2. 过程中要打印信息,自然需要-verbose即 -v
  3. 而且创建的jar包是一种文件,需要文件名 -f
  4. 创建jar包当然少不了MANIFEST.MF文件来指定入口,相关jre环境信息。-m

那么组合起来就是jar cvfm xxx.jar MANIFEST.MF

jar cvfm mytest.jar MANIFEST.MF MyTest.class /com

MANIFEST.MF

指定程序入口Main-Class,最后必须有一个空行

Manifest-Version: 1.0
Build-Jdk-Spec: 16
Main-Class: com.bean.anotation.MyTest

没有空行jar运行,空一行,不然无法识别最后一行的配置。最后一行无法被添加进清单,所以会报错
在这里插入图片描述
这时候我们可以-e来指定程序入口,这时解决了没有主清单属性
在这里插入图片描述
在这里插入图片描述

压入class文件

但为什么找不到类呢,类路径出问题,目前打包我们只指定了程序入口,没有指定打包哪些class。所以根本不会压入任何class文件。
在这里插入图片描述
加上要打包的类
在这里插入图片描述
我们也可以切换压缩目录-C 文件目录 文件名 ,那么其下对应指定的class文件都压入,要么就指定class(@文件列表也可以)

-C指定文件目录可以是相对的(/开头)也可以是绝对的(带有盘符),-C命令要空格
文件目录和文件名也需要空格,否则会报解析文件参数时出错。
在这里插入图片描述
在这里插入图片描述
但是清单文件我们以及m指定过了,会自动压入META-INF文件夹,又压入了anotation下,不合理但不影响运行。

我们再运行一下,但还是报错了
在这里插入图片描述
我们全路径类名是com.bean.anotation.MyTest,而com包没有被压入,只是把它之下的包和文件压入了。

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

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

相关文章

【GPT开发】人人都能用ChatGPT4.0做Avatar虚拟人直播

0 前言 最近朋友圈以及身边很多朋友都在研究GPT开发,做了各种各样的小工具小Demo,AI工具用起来是真的香!在他们的影响下,我也继续捣鼓GPT Demo,希望更多的开发者加入一起多多交流。 上一篇结合即时通 IM SDK捣鼓了一个…

2023mathorcup B题

已完成完整B题C题的模型代码,具体看文末 摘要 城市轨道交通系统作为城市出行的重要组成部分,对于缓解城市交通压力、提高出行效率具有重要意义。优化列车时刻表是提高运营效率、降低企业运营成本、提高乘客满意度的关键。本研究针对城市轨道交通列车时…

SAR ADC系列24:冗余设计

目录 冗余(Redundancy) 比较器出错:原因 比较器出错:后果 引入冗余:纠错 冗余:容错量 冗余:非二进制CDAC --sub二进制 冗余:提速 另一种冗余设计方法: 下面的关…

tab栏切换

效果&#xff1a; 当鼠标通过上边tab栏时&#xff0c;对应的元素变亮并切换到相应的菜单 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge…

英语学渣如何成功逆袭?聊聊我获得海外工作的真实经历

今天我想和大家分享一下作为一个英语学渣&#xff0c;我是如何成功找到一份海外工作的。希望能够给和我有相似经历的小伙伴们一些启示。以下是兴哥一个女粉丝成功逆袭的经历&#xff0c;大家可以一起旁观一下她的自白。 首先&#xff0c;让我简单介绍一下我的情况。我现在在芬…

【云原生概念和技术】1.2 云原生技术概括(上)

如果想了解或者学习云原生的友友们&#xff0c;欢迎订阅哦&#xff5e;&#x1f917;&#xff0c;目前一周三更&#xff0c;努力码字中&#x1f9d1;‍&#x1f4bb;…目前第一章是一些介绍和概念性的知识&#xff0c;可以先在脑海里有一个知识的轮廓&#xff0c;从第二章开始就…

window eNSP安装使用教程

1&#xff0c;需要的安装包&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1U38OENqOeKXDN0-ipFTxwA?pwdsd12 提取码&#xff1a;sd12 安装eNSP 根据提示&#xff1a;需要先安装wireshark, VirtualBox, winPcap,所以我们接下来先依次安装上面三个安装包。 1&#x…

教育大数据总体解决方案(3)

为区县教育局提供标准制定、流程把控、实施监控、决策支持等服务&#xff0c;支持在全市统一的评价指标体系基础上&#xff0c;为各个区县提供个性化定制功能&#xff0c;各县能够在市统一评价指标体系内任意调整、增加二三级评价指标项&#xff0c;并可以调整对应指标项的分数…

逍遥自在学C语言 | 位运算符<<的高级用法

前言 在上一篇文章中&#xff0c;我们介绍了~运算符的高级用法&#xff0c;本篇文章&#xff0c;我们将介绍<< 运算符的一些高级用法。 一、人物简介 第一位闪亮登场&#xff0c;有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿…

带你们偷瞄编程绕不开的C语言(二)

&#x1f929;&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;&#xff1a;这里是C专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c;希望可以帮到读者们哦。 &#x1f…

常见面试题之MQ篇

1.1.你们为什么选择了RabbitMQ而不是其它的MQ&#xff1f; 如图&#xff1a; 话术&#xff1a; kafka是以吞吐量高而闻名&#xff0c;不过其数据稳定性一般&#xff0c;而且无法保证消息有序性。我们公司的日志收集也有使用&#xff0c;业务模块中则使用的RabbitMQ。 阿里巴…

SQL——子查询

在SQL语言中&#xff0c;一个SELECT&#xff0d;FROM&#xff0d;WHERE语句 称为一个查询块。 子查询(或内层查询)是一个 SELECT 查询,它嵌套在 (1)SELECT、UPDATE、INSERT、DELETE 语句的 WHERE 、 (2)带GROUP BY 的 HAVING 子句内&#xff0c; (3)或其它子查询中 (与比较(6个…

JDBC MySQL ORM 实现登录功能(避免SQL注入)

目录 一、创建数据库表 二、创建Users类 三、登录类 四、存在的漏洞 &#xff08;1&#xff09;SQL注入 &#xff08;2&#xff09;分析 &#xff08;3&#xff09;补救 一、创建数据库表 CREATE DATABASE jdbcdatabase;CREATE TABLE IF NOT EXISTS user( uid INT PRIMARY KE…

windows 配置 libxml2

1、下载需要的包 1&#xff09;libconv LibIconv for Windows 2) libxml2 Releases GNOME / libxml2 GitLab 2、配置文件 将 libxml2 的包解压到一个目录&#xff0c;并在该目录下创建 include 和 lib 目录 将如下的 iconv.h 复制到新建的 include 目录 路径&#xff…

013 - C++引用

本期我们要讲的是 C 中的引用。 上期我们讨论了指针&#xff0c;如果你没有看过那期内容&#xff0c;你一定要回去看看&#xff0c;因为引用实际上只是指针的扩展&#xff0c;你至少需要在基本层面上理解指针是如何工作的&#xff0c;然后才能继续学习本期的内容&#xff0c;本…

UI Toolkit(1)

UI ToolkitUI Toolkit界面画布设置背景制作UI布局UI Toolkit界面 在Unity 2021LTS版本之后UI Toolkit也被内置在Unity中&#xff0c;Unity有意的想让UI Toolkit 成为UI的主要搭建方式&#xff0c;当然与UGUI相比还是有一定的差别。他们各有有点&#xff0c;这次我们就开始介绍…

【Homebrew】MacBook的第二个AppStore

英文官网&#xff1a;Homebrew — The Missing Package Manager for macOS (or Linux) 中文官网&#xff1a;macOS&#xff08;或 Linux&#xff09;缺失的软件包的管理器 — Homebrew 1 简介 Homebrew 由开发者 Max Howell 开发&#xff0c;并基于 BSD 开源&#xff0c;是一…

基于K-最近邻算法构建红酒分类模型

基于K-最近邻算法构建红酒分类模型 描述 Wine红酒数据集是机器学习中一个经典的分类数据集&#xff0c;它是意大利同一地区种植的葡萄酒化学分析的结果&#xff0c;这些葡萄酒来自三个不同的品种。数据集中含有178个样本&#xff0c;分别属于三个已知品种&#xff0c;每个样本…

4.10-4.11学习总结

目录 MySql 关系型库数据 mysql启动方法 SQL通用语法 查询表 创建表 Mysql数据类型 表操作-修改 MySQL图形化界面 DCL 函数 约束 JDBC MySql 关系型库数据 建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库 特点: 使用表存储数据&#xff0c;格式…

【C++】哈希(位图,布隆过滤器)

今天的内容是哈希的应用&#xff1a;位图和布隆过滤器 目录 一、位图 1.位图概念 2.位图的应用 二、哈希切分 三、布隆过滤器 1.布隆过滤器的概念 2.布隆过滤器的应用 四、总结 一、位图 1.位图概念 今天的内容从一道面试题开始引入&#xff1a; 给40亿个不重复的无符…