1. 程式人生 > >Spring Boot系列(五)建立jar與熱部署

Spring Boot系列(五)建立jar與熱部署

建立一個完全自包含的可執行jar檔案,該jar檔案可以在生產環境執行。可執行jars(有時候被稱為胖jars "fat jars")是包含你的編譯後的類和你的程式碼執行所需的依賴jar的存檔。

可執行jars在Java沒有提供任何標準的載入內嵌jar檔案(即jar檔案中還包含jar檔案)的方法。如果想釋出一個自包含的應用這就是一個問題。為了解決該問題,很多開發者採用"共享的"jars。一個共享的jar簡單地將來自所有jars的類打包進一個單獨的“超級jar”。採用共享jar方式的問題是很難區分在應用程式中可以使用哪些庫。在多個jars中如果存在相同的檔名(但內容不一樣)也會是一個問題。Spring Boot採取一個不同的途徑,並允許你真正的內嵌jars。

為了建立可執行的jar,需要將spring-boot-maven-plugin新增到我們的pom.xml中。在dependencies節點下插入以下內容:

<build>
   <plugins>
       <plugin>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-maven-plugin</artifactId>
       </plugin>
   </plugins
>

</build>

注意:spring-boot-starter-parent POM包含用於繫結repackage目標的配置。如果你不使用parent POM,你將需要自己宣告該配置。具體參考“Spring Boot Maven外掛”。

儲存pom.xml配置檔案,然後從命令列執行mvn package命令,具體執行如下:

$ mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO
] Building myproject 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] .... ..
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ myproject ---
[INFO] Building jar: /Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:1.3.0.BUILD-SNAPSHOT:repackage (default) @ myproject ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

檢視target目錄,應該看到myproject-0.0.1-SNAPSHOT.jar。該檔案應該有10Mb左右的大小。如果想看內部結構,你可以執行jar tvf命令:

$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar

在target目錄下,應該也能看到一個很小的名為myproject-0.0.1-SNAPSHOT.jar.original的檔案。這是在Spring Boot重新打包前Maven建立的原始jar檔案。

$ java -jar target/myproject-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '
_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |
____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.3.0.BUILD-SNAPSHOT)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.536 seconds (JVM running for 2.864)

快捷鍵ctrl+c退出程式。

熱部署

spring-boot-devtools是一個為開發者服務的一個模組,其中最重要的功能就是自動的將應用更改的程式碼到上傳至應用中,即在開發人員改變了一些程式碼或者配置檔案時,應用可以自動重啟,相信這功能對於開發人員來說的話是非常有用的,稱之為熱部署(熱載入)。

Spring Boot 1.3引入了devtools,這是一個在Spring Boot應用程式上工作時提高開發時間效率的模組。要啟用它,只需將以下依賴項新增到專案中:

<dependencies>
 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-devtools</artifactId>
   <version>1.5.6.RELEASE</version>
   <optional>true</optional>
 </dependency>
</dependencies>

當devtools執行時,如果重新編譯應用程式並自動重新整理,它會檢測到更改。這不僅適用於資源,還適用於程式碼。它還提供一個LiveReload伺服器以便每當事情發生變化時,它可以自動觸發瀏覽器重新整理。

Devtools可以配置為僅在靜態資源已更改時才重新整理瀏覽器(並忽略程式碼中的任何更改)。只需在專案中包含以下屬性:

spring.devtools.remote.restart.enabled=false

在devtools之前,該外掛預設情況下支援熱備份資源,但是目前已經被禁用了,如果需要使用,可以隨時通過配置專案來恢復它,具體配置資訊如下:

<build>
 ...
 <plugins>
   ...
   <plugin>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-maven-plugin</artifactId>
     <version>1.5.6.RELEASE</version>
     <configuration>
       <addResources>true</addResources>
     </configuration>
   </plugin>
   ...
 </plugins>
 ...
</build>

當啟用addResources時,如果執行應用程式,任何src/main/resources資料夾將被新增到應用程式類路徑,並且將刪除在target/classes中找到的任何重複項。這樣可以讓重新整理資源更加清晰,這在開發web應用程式時非常有用。在使用HTML,CSS或JavaScript檔案,可以立即檢視更改而無需重新編譯應用程式,這使得前端開發人員無需下載和安裝Java IDE。

預設情況下,修改/META-INF/maven,/META-INF/resources,/resources,/static,/public或者/templates目錄下的內容不會引起應用的重新啟動。意思是java程式碼,pom檔案,application.properties(yml)檔案的修改都會引起重新啟動。

通過以下方式,可以指定只有哪些目錄下的內容修改不會引起重啟:

spring.devtools.restart.exclude=static/**,public/**

以上配置說明只有static目錄和public目錄下的內容修改後不會引起重啟。由於預設的配置已經比較合理,所以我們進行上述配置,一種可能的情況是希望在預設的配置下,新增其他目錄下內容修改時也不重新啟動,將spring.devtools.restart.exclude改為spring.devtools.restart.additional-exclude即可。

注意:

1)使用此功能的副作用是在構建時過濾資源將不起作用。

2)為了與重新包裝目標保持一致,執行目標以這樣的方式構建類路徑,即外掛配置中排除的任何依賴項也從類路徑中排除。

3)在執行應用程式時包含測試依賴關係此功能是有用的。例如,如果要在使用存根類的測試模式下執行應用程式。可以將useTestClasspath引數設定為true。注意的是這僅適用於執行應用程式時而重新打包目標不會將測試依賴關係新增到生成的JAR/WAR。

文章轉載自 素文宅部落格 [https://blog.yoodb.com/]

本文地址:https://blog.yoodb.com/yoodb/article/detail/1412