jar包打包实践

本文内容

               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文件

            

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天水麒麟姜伯约

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值