替换springboot打好jar包中的class文件
<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
springbot项目中 通常使用上述方法打成jar包后,直接通过java -jar来运行。这种方式打成jar包的结构如下:
其中MANIFEST.MF内容如下:
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Title: grpc_server
Implementation-Version: 1.0-SNAPSHOT
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: cn.edu.nuc.App
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.7.9
Created-By: Maven JAR Plugin 3.2.2
Main-Class: org.springframework.boot.loader.JarLauncher
有的时候我们想临时替换一个class文件做测试,该如何做呢?
1、解压-替换-重新打包:
1.备份原jar:
cp app.jar app.jar.bak2.解压jar:
mkdir temp
cd temp
jar xf ../app.jar3.替换:
cp /path/to/new/MyClass.class BOOT-INF/classes/com/example/demo/4.重新打包:
jar cf ../app-fixed.jar *
注意:这种方式打好的包无法直接执行。因为Spring Boot的可执行jar有特殊的启动器和结构,不能直接用普通的jar cf命令打包,否则启动器会失效。推荐用Spring Boot提供的spring-boot-maven-plugin或spring-boot-gradle-plugin重新打包,或者用zip命令重新打包后再用spring-boot-loader启动。5.使用spring-boot-loader启动:
java -cp app-fixed.jar org.springframework.boot.loader.JarLauncher
2、使用jar命令直接替换class
jar uf app.jar BOOT-INF/classes/com/example/demo/MyClass.class
前提是你已经准备好新的MyClass.class
文件,且路径和jar内路径一致。
注意:
- 该方法不会破坏Spring Boot启动器结构,推荐使用。
- 需要保证class文件路径正确。
3、使用zip命令替换
jar包本质是zip包,也可以用zip命令替换:
zip -u app.jar BOOT-INF/classes/com/example/demo/MyClass.class