Micronaut 重載

2023-03-14 17:02 更新

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

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

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

自動(dòng)重啟

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

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

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

Micronaut 的啟動(dòng)時(shí)間很快,自動(dòng)重啟會(huì)導(dǎo)致一個(gè)干凈的狀態(tài),而不會(huì)出現(xiàn)潛在的難以調(diào)試的問題或內(nèi)存泄漏。

Maven 重啟

要使用 Maven 自動(dòng)重啟應(yīng)用程序,請(qǐng)使用 Micronaut Maven 插件(創(chuàng)建新 Maven 項(xiàng)目時(shí)默認(rèn)包含)并運(yùn)行以下命令:

使用 Micronaut Maven 插件

$ ./mvnw mn:run

每次更改類時(shí),插件都會(huì)自動(dòng)重新啟動(dòng)服務(wù)器。

Gradle 重啟

使用 Micronaut Gradle 插件時(shí),可以通過 -t 標(biāo)志激活 Gradle 對(duì)連續(xù)構(gòu)建的支持來激活 Gradle 自動(dòng)重啟:

使用 Gradle 自動(dòng)重啟

./gradlew run -t

每次您對(duì)類或資源進(jìn)行更改時(shí),Gradle 都會(huì)重新編譯并重新啟動(dòng)應(yīng)用程序。

JRebel

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

使用 CLI

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

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

安裝/配置 JRebel 代理

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

安裝目錄包含一個(gè)帶有代理文件的 lib 目錄。對(duì)于基于您的操作系統(tǒng)的適當(dāng)代理,請(qǐ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

記下相應(yīng)代理的路徑,并將值添加到您的項(xiàng)目構(gòu)建中。

Gradle

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

gradle.properties

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

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

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

您可以使用 ./gradlew run 啟動(dòng)應(yīng)用程序,它將包含代理。請(qǐng)參閱有關(guān) Gradle 重新加載或 IDE 重新加載的部分以設(shè)置重新編譯。

Maven

相應(yīng)地配置 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ù)構(gòu)建,讓您運(yùn)行的任務(wù)將在源文件更改時(shí)重新運(yùn)行。要將其與重新加載代理(如上所述配置)一起使用,請(qǐng)正常運(yùn)行應(yīng)用程序(使用代理),然后在啟用連續(xù)模式的單獨(dú)終端中運(yùn)行重新編譯任務(wù)。

運(yùn)行應(yīng)用

$ ./gradlew run

運(yùn)行重新編譯

$ ./gradlew -t classes

每次修改源文件時(shí)都會(huì)重新運(yùn)行類任務(wù),從而允許重新加載代理獲取更改。

使用 IDE 重新編譯

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

IntelliJ

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

Eclipse

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


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)