0%

使用Jar命令直接替换jar包中的class

image

使用场景

在平常的开发中,经常会遇到一些代码bug,并且有了bug修改后需要重新打包部署至服务器以修复bug,而在一些上线部属流程比较严格的公司,这个 打包->构建->代码检测->安全检测->提交流程->审批->部署 整个流程可能就需要耗时一天,所以一般情况下,我们是通过直接替换class然后重启的方式来进行变更的。

使用方法

在这里准备一个简单的小例子来说明如何使用 这个命令

新建两个测试类

  • Main.java 这个类是主类,用于调用需要被替换的类的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.lovedata.bigdata.jar;

/**
* Created by Running Snail on 2018/4/28.
* <p>
* 测试直接替换class文件而不用重启jar包
*
* @author Running Snail
*/
public class Main {

public static void main(String[] args) {
NeedReplace.print();
}

}
  • NeedReplace 这个类是需要被替换的类,这里是修改之前。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    package com.lovedata.bigdata.jar;

    /**
    * Created by Running Snail on 2018/4/28.
    *
    * @author Running Snail
    */
    public class NeedReplace {

    public static void print() {
    System.out.println("before replace");
    }

    }

打包为test.jar并且执行 java -jar test.jar 命令执行,执行结果如下

image

现在需要修改 NeedReplace 类 ,将 “before replace” 修改为 “ after replace”

image

在test.jar 的同目录下新建一个与NeedReplace 类的全路径相同的目录,执行以下命令

1
md com\lovedata\bigdata\jar

执行 java -jar 来进行替换

1
jar uvf test.jar com\lovedata\bigdata\jar\NeedReplace.class

再次执行 java -jar 命令查看效果,结果如下

image