Micronaut 重載

2023-03-14 17:02 更新

重新加載(或“熱加載”)是指在檢測到源文件發(fā)生更改時框架重新初始化類(和應用程序的一部分)。

由于 Micronaut 優(yōu)先考慮啟動時間,并且大多數(shù) Micronaut 應用程序可以在幾秒鐘內啟動,因此通??梢酝ㄟ^在進行更改時重新啟動應用程序來獲得高效的工作流程;例如,通過在 IDE 中運行測試類。

但是,為了讓您的更改自動重新加載,Micronaut 支持自動重啟和使用第三方重新加載代理。

自動重啟

在JVM上實現(xiàn)類重載的方式有很多種,各有優(yōu)缺點。以下是在不重啟 JVM 的情況下實現(xiàn)重新加載的可能方法:

  • JVM Agents - 可以使用 JRebel 之類的 JVM 代理,但是這些代理可能會產生異常錯誤,可能不支持所有 JDK 版本,并且可能導致緩存類或陳舊類。
  • ClassLoader Reloading - 基于 ClassLoader 的重新加載是大多數(shù) JVM 框架使用的流行解決方案;然而,如果使用不正確的類加載器,它又會導致緩存類或陳舊類、內存泄漏和奇怪的錯誤。
  • Debugger HotSwap - Java 調試器支持在運行時熱交換更改,但僅支持少數(shù)用例。

鑒于現(xiàn)有解決方案存在的問題以及 JVM 中缺乏重新加載更改的內置方法,最安全和最佳的重新加載解決方案,也是 Micronaut 團隊推薦的解決方案,是通過第三方工具使用自動應用程序重啟。

Micronaut 的啟動時間很快,自動重啟會導致一個干凈的狀態(tài),而不會出現(xiàn)潛在的難以調試的問題或內存泄漏。

Maven 重啟

要使用 Maven 自動重啟應用程序,請使用 Micronaut Maven 插件(創(chuàng)建新 Maven 項目時默認包含)并運行以下命令:

使用 Micronaut Maven 插件

$ ./mvnw mn:run

每次更改類時,插件都會自動重新啟動服務器。

Gradle 重啟

使用 Micronaut Gradle 插件時,可以通過 -t 標志激活 Gradle 對連續(xù)構建的支持來激活 Gradle 自動重啟:

使用 Gradle 自動重啟

./gradlew run -t

每次您對類或資源進行更改時,Gradle 都會重新編譯并重新啟動應用程序。

JRebel

JRebel 是一個專有的重新加載解決方案,它涉及一個代理庫,以及復雜的 IDE 支持。 JRebel 文檔包括 IDE 集成和使用的詳細步驟。在本節(jié)中,我們將展示如何為 Maven 和 Gradle 項目安裝和配置代理。

使用 CLI

如果您使用 Micronaut CLI 創(chuàng)建項目,請?zhí)峁?nbsp;jrebel 功能以在您的項目中預配置 JRebel 重新加載。請注意,您需要安裝 JRebel 并在 gradle.properties 文件(對于 Gradle)或 pom.xml(對于 Maven)中提供代理的正確路徑。必要的步驟如下所述。

$ mn create-app my-app --features jrebel

安裝/配置 JRebel 代理

安裝 JRebel 的最簡單方法是從 JRebel 下載頁面下載“獨立”安裝包。將下載的文件解壓到方便的位置,例如 ~/bin/jrebel

安裝目錄包含一個帶有代理文件的 lib 目錄。對于基于您的操作系統(tǒng)的適當代理,請參見下表:

表 1. JRebel Agent
OS Agent

Windows 64-bit JDK

[jrebel directory]\lib\jrebel64.dll

Windows 32-bit JDK

[jrebel directory]\lib\jrebel32.dll

Mac OS X 64-bit JDK

[jrebel directory]/lib/libjrebel64.dylib

Mac OS X 32-bit JDK

[jrebel directory]/lib/libjrebel32.dylib

Linux 64-bit JDK

[jrebel directory]/lib/libjrebel64.so

Linux 32-bit JDK

[jrebel directory]/lib/libjrebel32.so

記下相應代理的路徑,并將值添加到您的項目構建中。

Gradle

將路徑添加到 gradle.properties(必要時創(chuàng)建文件),作為 rebelAgent 屬性。

gradle.properties

#Assuming installation path of ~/bin/jrebel/
rebelAgent= -agentpath:~/bin/jrebel/lib/libjrebel64.dylib

將適當?shù)?nbsp;JVM arg 添加到 build.gradle(如果使用 CLI 功能則不需要)

run.dependsOn(generateRebel)
if (project.hasProperty('rebelAgent')) {
    run.jvmArgs += rebelAgent
}

您可以使用 ./gradlew run 啟動應用程序,它將包含代理。請參閱有關 Gradle 重新加載或 IDE 重新加載的部分以設置重新編譯。

Maven

相應地配置 Micronaut Maven 插件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <!-- ... -->
  <build>
    <plugins>
      <!-- ... -->
      <plugin>
        <groupId>io.micronaut.build</groupId>
        <artifactId>micronaut-maven-plugin</artifactId>
          <configuration>
            <jvmArguments>
              <jvmArgument>-agentpath:~/bin/jrebel/lib/jrebel6/lib/libjrebel64.dylib</jvmArgument>
            </jvmArguments>
          </configuration>
      </plugin>
      <plugin>
        <groupId>org.zeroturnaround</groupId>
        <artifactId>jrebel-maven-plugin</artifactId>
        <version>1.1.10</version>
        <executions>
          <execution>
            <id>generate-rebel-xml</id>
            <phase>process-resources</phase>
            <goals>
              <goal>generate</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <!-- ... -->
    </plugins>
  </build>
</project>

使用 Gradle 重新編譯

Gradle 支持連續(xù)構建,讓您運行的任務將在源文件更改時重新運行。要將其與重新加載代理(如上所述配置)一起使用,請正常運行應用程序(使用代理),然后在啟用連續(xù)模式的單獨終端中運行重新編譯任務。

運行應用

$ ./gradlew run

運行重新編譯

$ ./gradlew -t classes

每次修改源文件時都會重新運行類任務,從而允許重新加載代理獲取更改。

使用 IDE 重新編譯

如果您使用不支持自動重新編譯文件更改的構建工具(如 Maven),您可以使用您的 IDE 結合重新加載代理(如上述部分中配置)重新編譯類。

IntelliJ

不幸的是,IntelliJ 沒有適用于正在運行的應用程序的自動重建選項。但是,您可以使用 CMD-F9 (Mac) 或 CTRL-F9 (Windows/Linux) 觸發(fā)項目的“重建”。

Eclipse

在“項目”菜單下,選中“自動構建”選項。每當文件更改保存到磁盤時,這將觸發(fā)項目的重新編譯。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號