最近搞maven插件打包什么的,关于怎么把第三方jar包打进jar里,搞得很晕,于是乎干脆回归本源,研究下最朴素的如何使用jar命令来做这事;
一、先说运行,可以选择java -jar 或者 java -cp
如果是jar包中包含了定义入口的清单文件,那首选使用java -jar
如果没有定义入口清单,并且多个jar联合运行,那么使用java -cp来指定 classpath路径或者jar文件, 并在后面跟着入口类参数。
1、如果是引入多个路径, -cp后,多个路径用:分割(linux平台),最后一个路径后面": "分割参数和主类名(可选)例如:
java -cp /path1/1.jar:/path2/2.jar: MainClass
2、如果是class文件,只要指定路径,例如:
java -cp /classpass1 MainClass
3、如果是jar包,那么需要指明jar名,或者干脆 *号,例如
java -cp /path1/1.jar:/path2/* MainClass
4、当然也可以混合,class文件和jar包都出现在cp参数中,例如:
java -cp /p1/1.jar:/p2 MainClass
二、再说打包
首先jar包其实本质就是符合规范的zip文件,可以用zip软件解压,甚至可以修改后重新用zip打包;
常用固定命令 打包(c)、查看(t)、解压(x)
常用参数 v,显示动作的详情
常用参数f,指定jar包名字
可选参数 m,指定读取自定义的清单,并写入META-INF/MANIFEST.MF
可选参数 e,在命令行指定入口,但如果同时使用了 m参数,并且manifest中有Main-Class,那会报错;
可选参数 C, 进入指定目录执行资源打包,有些类似于 cd这个目录,这样就不会把这个目录本身打进去,比较方便;
至于最后的files ,可以为一个个的class文件, 也可以是一个目录, 比如就是 . ,配合-C,就相当于把-C指定目录u的东西都打进去;
打包举例:
在classes目录中,放入编译好的App.class,在其中建立lib目录,放入需要的外部jar包,people.jar;
清单文件
Manifest-Version: 1.0
Main-Class: App
Class-Path: lib/people.jar
命名为mymanifest
开始打包
jar cvfm App.jar mymanifest -C classes .