在某些情况下,直接替换jar中的class文件,可以免去编译构建jar的时间,快速修改代码。
例如需要对测试环境代码做些小调整时,如修改某个变量,if条件等,可以在本地机器上修改代码,编译成class后上传到测试环境,直接替换jar中的class文件,重启应用就可以了,这样可以节约不少时间。
这时,我们需要使用jar命令。
替换class
例如,我们要替换jar中的HelloController.class
$ jar uvf web-start-1.0-SNAPSHOT.jar BOOT-INF/classes/com/binecy/controller/HelloController.class
正在添加: BOOT-INF/classes/com/binecy/controller/HelloController.class(输入 = 1664) (输出 = 839)(压缩了 49%)
注意:新的class文件必须放到jar中原class文件相同的目录下。如上面例子,原HelloController.class在jar中的BOOT-INF/classes/com/binecy/controller/目录下,所以新的HelloController.class也要放到BOOT-INF/classes/com/binecy/controller/(否则会新增一个class文件,而不能替换原class文件)。
参数解释:
u : 替换或添加文件
v : 生成详细的报造,并输出至标准设备
f : 指定jar包的文件名
修改配置
如果只是修改配置文件就更简单了,使用vim就可以了。
vim jar
会列出jar中所有的文件,输入 /
可以通过文件名找到对应文件,回车就可以使用vim编辑该文件了(编译完成后使用w保持该文件)。
替换class时,可以用这个方法找出class的目录
手动打包
我们也可以先解压jar,手动替换class后重新打包jar,不过做法更繁琐,这里只做记录,不推荐使用。
1.解压
jar xvf web-start-1.0-SNAPSHOT.jar
参数解释:
x : 解压jar包
2.打包
jar cvf0m web-start-1.0-SNAPSHOT.jar META-INF/MANIFEST.MF .
参数解释:
c : 创建一个jar包
m : 指定manifest.mf文件,上面例子中META-INF/MANIFEST.MF就是指定MANIFEST.MF,默认没有MANIFEST.MF文件,无法启动java进程。
0 : 创建jar包时不对其中的内容进行压缩处理,压缩内容可能导致如下错误
It has been compressed and nested jar files must be stored without compression.
Please check the mechanism used to create your executable jar file
使用阿里的Arthas工具也可以替换jar中的class文件,这是后话了。