替换jar的class文件

在某些情况下,直接替换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文件,这是后话了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文详细讲述了JAR命令的用法,对于大家学习和总结jar命令的使用有一定的帮助作用。具体如下: JAR包是Java...
    老九君阅读 1,546评论 0 0
  • 步骤 使用jd-gui查看jar文件或者把jar文件放到AndroidStudio中查看需要修改的X.class文...
    Allenlll阅读 11,358评论 0 0
  • ANT build.xml文件详解(一) Ant的概念 可能有些读者并不连接什么是Ant以及入可使用它,但只要使用...
    SkTj阅读 4,065评论 0 2
  • Java jar命令 常见用法 一、jar命令作用: 进行打包 -- 把多个文件打包成一个压缩包 -- 这个压缩包...
    坚持未来阅读 16,361评论 0 2
  • jar文件听说过吗,没有?或者陌生!好,没关系,这就是我们的第一站:打包发布。 为什么会有这个玩意呢,首先,这是j...
    轻舞琉璃殇阅读 725评论 0 0