jar包打包实践

2023-11-17

本文内容

               1. 不打包运行java应用程序

               2.命令行打包的几种方式

               3.非springboot项目如何使用springboot的打包方式

前言

          作为java程序员,打包是一项基础性的技能。开发工具一般都集成了相应的打包功能,似乎不用我们投入过多的关注。但是开发工具的打包功能也不是万能的,也不一定能适合所有的场景。就好比交通工具,虽然有汽车,但是在交通拥堵的路面也许不如自行车灵活方便。所以我们还是有必要去了解一下如何使用JDK自带的工具进行打包。

一 、不打包运行java程序

            一般的,我们可以定位到Class文件的目录并运行Class主类,可以使用命令 java 类完全限定名称 在命令行下执行java程序,这是类在没有任何外部引用的情况下的用法

            

上面例子的前提是jdk bin目录已经加入了环境变量,并且命令的工作目录是在类的根目录。类文件所在目录是 F:\git26\springboot包\BOOT-INF\classes\com\suntown\Test.class .而我们的执行目录是 F:\git26\springboot包\BOOT-INF\classes,如果我们不在类的根目录执行主类的话,就需要使用  -cp 类路径   的命令行选项 来指定类的查找路径

-cp 类路径 可以出现多次,一次指定的话,多个类路径可以用;分隔

 上面的测试例子比较简单,实际的项目中我们会引用很多的jar包和文件目录,那么如果还是使用上面命令行的方式 会导致命令行参数过长,会很容易出错

当然,对于命令行过长的问题,在windows下我们可以使用符号 ^  下换行处理

 在linux下对应的符号是 \

二 、命令行打包的几种方式

        1. 使用JDK工具 jar 命令 打包

           使用 jar cvf jar包文件名 文件目录名 命令生成 不可执行的jar包,因为它缺少MANIFEST.MF清单文件 ,如果直接使用java -jar 运行它会提示 t1.jar 中没有主清单属性 下图中我们把classes目录下的com文件夹打成jar包

           可以使用 jar cvfm 命令指定一个清单文件MANIFEST.MF,那么我们可以在classes目录下面新建一个MANIFEST.MF文件并指定运行的主类名 com.suntown.Test,完成之后使用java -jar 命令运行jar包

            这个命令要注意的是MANIFEST.MF需要在com目录之前

       

相比于上面使用指定MANIFEST.MF清单文件的方式,我们还可以使用 jar cvfe 命令直接在命令行指运行的主类名 ,这样就省去了创建MANIFEST.MF文件的过程

 值得注意的是 上述jar命令执行 的目录是classes文件的根目录 F:\git26\springboot包\BOOT-INF\classes,如果我们不在classes文件目录打包,则需要加入 -C 选项 指定待打包的文件目录

 

2.使用JDK工具 javapackager 命令打包

   该命令打包格式为  javapackager -createjar -appclass 主类名 -srcfiles 源路径名称 -outfile 输出的jar文件名,打出的包直接可以运行

 上面的测试环境是在没有引用任何外部jar包的情况下,如果有引用外部jar包则需要在MANIFEST.MF清单文件中指定ClassPath属性,在有外部引用jar包的情况下,如果主类在文件目录中,可以使用 -cp 指定依赖的jar包来运行

 如果主类在jar包中,则MANIFEST.MF中加入ClassPath属性,修改MANIFEST.MF之前我们可以在命令行参数之中加入 -cp jar包路径测试一下这种方法对jar是否有效

 发现 加入 -cp 选项这种方法对jar包无效,所以只能修改MANIFEST.MF文件

 加入ClassPath属性之后可以运行正常

要注意的是ClassPath属性的冒号后面有一个空格,并且存在多个jar包文件 的情况下 多个jar包文件以空格分隔,它们的路径必须是相对于主类所在jar包的路径,类似下图中的格式是允许的

三、非springboot项目如何使用springboot的打包方式

    我们知道springboot打包之后所有的文件都会打到一个jar包中去,这种打包方式的好处是显而易见的。我们来看一下springboot打包之后jar文件的目录结构

   

org目录下面是springboot 启动器相关的class文件

 META-INF下面是清单文件MANIFEST.MF

 清单文件Start-Class属性是我们项目中实际的入口,Spring-Boot-Classes和Spring-Boot-Lib以及Main-Class属性的值基本不变,根据可执行jar包的运行原理可以判断出 先执行org.springframework.boot.loader.JarLauncher 类的main方法,在JarLauncher中完成类路径的查找之后将控制权转移到了com.suntown.Test

BOOT-INF下面有classes 和 lib两个子目录

以一个使用springboot 的jar包为例,删除jar中根目录下面的 BOOT-INF\lib 和 BOOT-INF\classes 两个目录下面的所有文件,只保留 META-INF和org两个目录,在这个jar包的相同目录创建BOOT-INF目录,然后在BOOT-INF目录下创建lib和classes子目录,将测试用的 com.suntown.Test主类 class文件放入BOOT-INF\classes目录下,demo.jar放入BOOT-INF\lib目录下,目录结构如下

然后使用jar打包命令 将BOOT-INF目录更新到springboot 的 jar 包

注意上面的更新命令jar u0vf ,正常情况下使用jar uvf就可以将普通的文件 更新到jar包,使用u0vf 是为了将jar包更新到jar包中,因为BOOT-INF/lib下面存放的是jar文件,如果只使用uvf,则是下面这种效果

 使用jar u0vf 更新jar包后 运行springboot的jar包

 发现能够正常启动,所以对于有些非springboot项目,我们也可以尝试使用这种方式打包成单个可运行的jar包。当然对于springboot 的项目同样有效 ,有的时候maven配置项太多,可能最后包里面还漏了一些jar包,我们就可以使用这样方式添加漏掉的jar文件

            

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jar包打包实践 的相关文章

随机推荐

  • SQL 注入-盲注

    目录 一 什么时候用到盲注 二 盲注的优缺点 三 盲注的流程 四 盲注的分类 五 布尔盲注 5 1 原理以及什么时候使用布尔盲注 5 2 例如upload labs靶场中的Less 8 5 3 布尔盲注常用函数及定义 5 4 length
  • PyQt5 第一章 PyQt5简介和安装

    第一章 PyQt5简介和安装 零基础入门玩转 PyQt5 邀请码 LWskm3AS 1 1 PyQt5 简介 PyQt5是Digia的一套Qt5应用框架与python的结合 同时支持2 x和3 x Qt库由Riverbank Computi
  • 计算机与图像处理论文标题,数字图像处理论文各种题目.doc

    数字图像处理论文各种题目 待处理图片 参考最终效果图 29利用中值空间滤波去去除波形噪声 要求 掌握空间滤波原理 了解中值空间滤波在实际中的应用 利用MATLAB实现对波形的中值滤波 改进算子 使图像达到标准对照图像效果 待处理图片 处理后
  • webpack html 引入cdn,Webpack如何引入CDN连接来优化编译后的体积

    背景 在 Vue 项目中 引入到工程中的全部 js 文件 编译时都会被打包进 vendor js 也就致使了 vendor js 文件体积变得至关臃肿 必定程度上影响着页面的渲染 为了减小编译后的体积 提升页面渲染速度 咱们能够经过引入 C
  • python时间戳转换年,月,日,季度,周

    数据结构 def q year day week day dict 0 星期一 1 星期二 2 星期三 3 星期四 4 星期五 5 星期六 6 星期天 for x in range 0 366 time item star time int
  • github上传的报错的问题解决

    文章目录 前言 一 遇见的问题 二 开始配置ssh key 这就完成了 可以重新尝试一下上面代码到github 前言 有很多伙伴们在操作github时候 上传代码的时候 会有报错问题 上传代码失败 这里我给出我本人的的解决办法 一 遇见的问
  • Sakura美化

    文章原地址在 我的博客 接上次的文章 闲着也是闲着 不如搭个免费的博客玩玩 0 前言 做hexo的美化工作 主要是 修改布局文件 HTML模板ejs文件 添加功能 做好CSS 还是得对HTML 结构 CSS 表现 Javascript 行为
  • 【华为OD机试真题 Python】整理扑克牌 (A卷2022Q4)

    前言 本专栏将持续更新华为OD机试题目 并进行详细的分析与解答 包含完整的代码实现 希望可以帮助到正在努力的你 关于OD机试流程 面经 面试指导等 如有任何疑问 欢迎联系我 wechat steven moda email nansun09
  • python数据容器--集合的常用操作

    python数据容器 集合的常用操作 数据是无序存储的 不支持下标索引 不允许重复数据的存在 set集合基本操作 my set 传智教育 itheima 黑马程序员 添加新元素 my set add python print f 添加元素后
  • Mysql mysqldump备份数据

    mysqldump客户端实用程序执行逻辑备份 生成一组 SQL 语句 可以执行这些语句来重现原始数据库对象定义和表数据 它转储一个或多个 MySQL 数据库以进行备份或传输到另一台 SQL 服务器 mysqldump 命令还可以生成 CSV
  • C++实验一:简单数据及运算(解方程、海伦公式求三角形面积)

    实验目的 1 掌握C 中的基本数据类型的算术运算和逻辑运算 2 理解并掌握C 中运算符的优先级 3 掌握简单的类型转换方法 4 掌握C 的math头文件中常用的几种数学运算 5 了解visual studio的debug功能 并使用debu
  • Java动态代理代码编写

    Java动态代理代码编写 代理的概念 动态代理技术是整个java技术中最重要的一个技术 它是学习java框架的基础 不会动态代理技术 那么在学习Spring这些框架时是学不明白的 动态代理技术就是用来产生一个对象的代理对象的 在开发中为什么
  • 《AGIC学习之 LangChain获取电影信息》

    先获取 TMDB 的token https www themoviedb org settings api 申请API 应用URL是你的ip地址才行 应用简介要翻译为英文 import os os environ TMDB BEARER T
  • 企业电子招标采购系统源码Spring Cloud + Spring Boot + MybatisPlus + Redis + Layui + 前后端分离 + 二次开发

    功能描述 1 门户管理 所有用户可在门户页面查看所有的公告信息及相关的通知信息 主要板块包含 招标公告 非招标公告 系统通知 政策法规 2 立项管理 企业用户可对需要采购的项目进行立项申请 并提交审批 查看所有的立项信息 主要功能包含 招标
  • Ubuntu输入密码后无法进入桌面,但是可以进入命令行界面

    安装中文版的ubuntu经常会出现无法进入桌面的状况 这里给出我的解决方案 初步断定是Xwindows界面软件出问题了 所以重装即可 Solve 1 Ctrl Alt F1进入命令行界面 root账户登陆 Ctrl Alt F1进入命令行界
  • yum出现Error downloading packages错误

    yum出现Error downloading packages错误 错误表现方式 yum可以list 可以clean cache 但是无法安装 错误提示 Downloading packages Error downloading pack
  • Ubuntu上用网易云音乐乱码(亲测可用)

    使用Ubuntu听音乐的时候 播放列表总显示为乱码 这点非常不爽 于是上网搜索了下 终于找到了解决的办法 简单的方法就是将MP3标签转换为Unicode编码 要使用到python mutagen 在新立得软件管理中可以直接找到 也可以用以下
  • 让 Linux 应用随处运行,使用AppImage的方式安装软件!

    前言 大家好 我是小满同学 我是通过中国大学MOOC上的 零基础学Linux操作系统 这门课程入门了linux 学习和使用linux一年多 收获了很多 下面是关于linux下安装软件方式的一些分享 在课程中 我们了解到在linux平台下安装
  • 【含视频教程】python实现图书管理系统

    嗨嗨 大家好 我是小圆 今天给大家分享一下如何用python实现图书管理系统 手把手带你制作图书管理系统 文章末尾还有视频教程哦 话不多说马上开始吧 用户注册 def logon print 欢迎来到图书管理系统注册页面 username
  • jar包打包实践

    本文内容 1 不打包运行java应用程序 2 命令行打包的几种方式 3 非springboot项目如何使用springboot的打包方式 前言 作为java程序员 打包是一项基础性的技能 开发工具一般都集成了相应的打包功能 似乎不用我们投入