之前寫過使用自定義的classLoader進行動態加載,熱部署;它有很多弊端,我總結一下:
- 當前項目不能引用第三方包
- 當前項目必須使用反射的方式調用第三方包的方法
- 寫死的一些路徑
springloaded
源碼:https://github.com/spring-projects/spring-loaded
功能:實現java項目的依賴包的熱更新
研究了一天,終於研究出了成功了,國內也有不少這方面的文章,但也有一些坑,所以我總結一下:
- 源項目 a-start-hot-deploy
- 依賴項目 a-start-hot-dependency
- 工具 springloaded 1.2.5 (https://repo.spring.io/release/org/springframework/springloaded/1.2.5.RELEASE/springloaded-1.2.5.RELEASE.jar)
實現方式
a-start-hot-dependency里有一個類
public class HelloImpl implements Hello {
@Override
public String password() {
return "hello 牛";
}
}
添加項目依賴
<dependency>
<groupId>com.lind</groupId>
<artifactId>a-start-hot-dependency</artifactId>
<version>1.0.0</version>
</dependency>
依賴也里方法調用
@GetMapping("auto")
public ResponseEntity auto() {
return ResponseEntity.ok(new HelloImpl().password());
}
部署方式
- 復制三個包到發布的目錄springloaded-1.2.5.RELEASE.jar,a-start-hot-deploy-1.0.0.jar,a-start-hot-dependency-1.0.0.jar
- 使用java命令進行部署
java -noverify -javaagent:D:/springloaded-1.2.5.RELEASE.jar -Dspringloaded="watchJars=a-start-hot-dependency-1.0.0.jar" -jar a-start-hot-deploy-1.0.0.jar
- 當前a-start-hot-dependency-1.0.0.ja有更新時,可以看到控制台的變化
看了很多文章,寫的命令都有問題,最后還是機緣巧合的成功了!