iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
自我挑戰組

探索 Spring Boot Doc系列 第 18

Doc 6.8.3 Customizing the Restart Classloader

  • 分享至 

  • xImage
  •  

Doc 6.8.3 Automatic Restart: Customizing the Restart Classloader

As described earlier in the Restart vs Reload section, restart functionality is implemented by using two classloaders. If this causes issues, you might need to customize what gets loaded by which classloader.

devtools 的 restart 機制是靠兩個 ClassLoaders 所實作,假設 classloading issues 發生,
互許可以透過客製化來解決問題; 這裡的客製化,並非要你自己實作 ClassLoader 類別,
而是由使用者決定兩個ClassLoader 載入哪一些內容 。

By default, any open project in your IDE is loaded with the “restart” classloader, and any regular .jar file is loaded with the “base” classloader. The same is true if you use mvn spring-boot:run or gradle bootRun: the project containing your @SpringBootApplication is loaded with the “restart” classloader, and everything else with the “base” classloader.

restart classloader 讀取任何 open project , 而 regular jar 檔案由 base classloader 所讀取,這裡所提及的 open and regular 分別代表的是,使用者自己撰寫的內容以及使用者導入第三方的依賴。
不管你是用mvn 或是 gradle 哪一個專案建置工具去啟動 spring boot application ,包含 @SpringBootApplication 標籤的整個專案的內容是由 restart classloader 載入,
其餘的會是 base classloader 所載入 。

https://ithelp.ithome.com.tw/upload/images/20231001/20161770cYFtaa0LBa.png

You can instruct Spring Boot to load parts of your project with a different classloader by creating a META-INF/spring-devtools.properties file. The spring-devtools.properties file can contain properties prefixed with restart.exclude and restart.include.

The include elements are items that should be pulled up into the “restart” classloader, and the exclude elements are items that should be pushed down into the “base” classloader. The value of the property is a regex pattern that is applied to the classpath, as shown in the following example:

使用者可以透過 /META-INF/spring-devtools.yml(或是properties 檔案) 去設定客製化 classloaders 的讀取; include 代表拉進去 restart classloader,exclude 代表推下去 base classloader ,簡單來說就是

the project containing your @SpringBootApplication is loaded with the “restart” classloader, and everything else with the “base” classloader.

所提及的內容,restart 和 base classloader 加起來等於1,使用者不是把東西拉進去給 restart classloader 負責,就是推出去給 base classloader ,兩者就是互為互補

使用者可以透過 /META-INF/spring-devtools.yml(或是properties 檔案) 去設定客製化 classloaders 的讀取; include 代表拉進去 restart classloader,exclude 代表推下去 base classloader ,簡單來說就是,
”the project containing your @SpringBootApplication is loaded with the “restart” classloader, and everything else with the “base” classloader. “ 所提及的內容,restart 和 base classloader 加起來等於1,使用者不是把東西拉進去給 restart classloader 負責,就是推出去給 base classloader ,兩者就是互為互補。

下方為官方給出的範例,其中有支援正則表示式

restart:
  exclude:
    companycommonlibs: "/mycorp-common-[\\w\\d-\\.]+\\.jar"
  include:
    projectcommon: "/mycorp-myproj-[\\w\\d-\\.]+\\.jar"

注意:

  1. companycommonlibs、projectcommon 作為使用者決定的 key,必須唯一值
  2. /META-INF/spring.devtools.yml 建立在 src/main/resources/META-INF

參考資料

{官方} customizing-the-classload
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using.devtools.restart.customizing-the-classload

Java: Get Started with Spring Boot
https://medium.com/nycdev/big-java-get-booted-with-spring-1896055c3803


上一篇
Doc 6.8.3 Automatic Restart: Using a Trigger File
下一篇
Doc 7.1. SpringApplication
系列文
探索 Spring Boot Doc30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Sam
iT邦新手 4 級 ‧ 2023-10-04 00:24:27

包成 jar 用 spring plugin 或是用 jib 都有不一樣的特性, 會影響 devtool 是否會觸發執行, 可以多注意一下

我要留言

立即登入留言