iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
Software Development

從零開始構建能理解語義的 Linebot 架構系列 第 25

使用 Spring Boot 開發 Backend Bot Server: Maven 管理專案與依賴的實踐筆記

  • 分享至 

  • xImage
  •  

概述

前面介紹了如何使用Spring Kafka開發Consumer,本篇文章則說明一些開發工作以外的眉角。我個人覺得 Spring Boot的最大優點是: "一旦把所有該設定的東西設好後,開發就變得相對簡單"。然而最大的挑戰在於:"誒,他要設定的東西真的有點多"。相信許多從JavaScript或其他直譯式語言轉到 Spring 開發的人應該都能體會這種感受。

以下是我在開發過程中踩雷時,學習到的一些基本知識與筆記,包括:

  • 初始化專案
  • Maven 簡介
  • Trouble shooting 記錄

初始化專案與 IDE 設定

使用 Spring Initializr 生成專案

前面提過,我們可以用Spring Initializr來快速生成初始化套件,這邊說明一些細節及注意事項:
https://ithelp.ithome.com.tw/upload/images/20241008/20105227gtFDk0owzy.png

  • 依賴的版本
    • 請注意,不同版本的Spring Boot所支援的Java版本及Spring Framework版本是不同的。例如Spring Boot 3.0已經不再支援Java 8,要求Java 17或更新的版本,並且需搭配Spring Framework 6.0以上的版本。
    • 通常,一些依賴的錯誤修正會需要升級到新的Spring Boot版本,在遇到問題且 Java 版本較舊的情況下,可能要權衡一下,看是要把Java升級,或使用一些替代方案避掉問題。有時候,不一定升到最新版才是最佳解,畢竟升級Java也可能衍生一些別的問題要解決。
  • 生成的專案並不包含依賴本身,而是把Starter的配置幫你寫好在設定檔內。我們必須用IDE或者下指令的方式,下載這些 Starter所包含的jar檔(Java 打包後的檔案)。

在IDE中匯入 Maven 專案

  • 本專案使用Maven作為專案管理工具,並使用InteliJ這個IDE。
  • 在InteliJ中,只需要直接Open -> 選擇解壓縮後的目錄即可匯入專案
  • 匯入專案後,在專案根目錄點擊右鍵 → Maven → Reload Project或者Download Soruce 即可下載專案依賴:
    https://ithelp.ithome.com.tw/upload/images/20241008/20105227iQ0YDxiVZI.png

使用Maven進行專案管理

依賴管例

  • Maven是Java用來管理依賴的工具之一,角色就如同Node.js的npm。你可以在官方Repository網站搜尋需要的依賴,該網站會提供該依賴的設定資訊。只要將設定貼到pom.xml,依照上述步驟Reload Project,就可以把套件下載完成。
  • Maven會負責管理這些依賴的類別路徑(Class Path),確保專案可以順利的匯入(import)並使用他們。

依賴存放路徑

  • 透過Maven下載的依賴,實際上是根據package目錄存放的jar檔,這些檔案會存放在每個用戶的 .m2/repository目錄,路徑如下:
/Users/User名稱/.m2/repository
  • 在某些情況下,我們可能需要手動在此目錄中更新套件,或者移除舊的套件以便重新安裝。

專案的打包與執行

執行方式的選擇

執行Spring程式時,可以選擇使用Spring Boot Maven直接執行,或者先用Maven將Spring 打包成jar檔,然後再使用一般的Java執行方式來執行。後者是一種可以在任何Java環境中執行的可攜式檔案,因此在本專案中,我們選擇使用這種方式來部署。

先用Maven將Spring 打包, 再執行

  • 打包指令
mvn clean package
  • 執行指令
java -jar target/xxx.jar

用Spring Boot Maven執行

  • 需要在Maven中新增spring-boot-maven-plugin,實際上,使用Spring Initializr創建的專案中的 pom.xml檔案中,已經自動將spring-boot-maven-plugin加入到依賴中。
  • 執行指令
mvn spring-boot:run

使用spring-boot-devtools提供的Hot Swapping功能

  • Hot Swapping就是容許我們在開發過程中,不用把程式停下來,便可進行即時重新載入(Live Reload),使修改的程式碼或依賴立即生效。Spring提供了devtools來實現這個功能,增加我們開發及測試的效率。
  • 只需在pom.xml中加入以下dependency,並在resources/application.properties檔案中加入設定:
  • pom.xml
<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-devtools</artifactId>
		<optional>true</optional>
	</dependency>
</dependencies>
  • application.properties
spring.devtools.restart.enabled=true

注意: 因為安全性考量,在正式環境時應把Hot Swapping關掉: Dspring.devtools.restart.enabled=false

Trouble shooting筆記

  • 以下是在使用Maven打包或執行Spring時遇過的一些問題,希望可以幫助大家少繞點路:

用mvn打包時出現: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field

  • 執行mvn clean package時出現以下錯誤:
Fatal error compiling: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid'
  • 這是因為Lombok版本和Spring Boot用的JDK版本不匹配,在Maven指定Lombok版本為1.18.30即可。
  • 通常發生在JDK版本很新的狀況。

Dependency版本問題

  • 執行mvn clean package,或者執行mvn spring-boot:run 時出現以下錯誤::
class file has wrong version 61.0, should be 57.0
  • 這代表使用的dependency用比開發環境更新的JDK版本Build的。
  • 解決方式:
    • 1.使用比較舊版的dependency。
    • 2.升級開發環境的JDK。

Maven: Invalid target release

  • 請檢查pom.xml裡面使用java.version是否與執行環境不一致。

No plugin found for prefix 'spring-boot'

  • 執行mvn spring-boot:run時出現以下錯誤:
No plugin found for prefix 'spring-boot' in the current project and in the plugin groups
  • 這可能是目錄切錯了,在沒有pom.xml的情況下執行時,會出現這個錯誤。
  • 請檢查pom中是否包含:
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>x.x.x.RELEASE</version> 
 </parent>
  • 注意: x.x.x.RELEASE 需替換成指定的版本。

總結

本篇文章記錄了開發Spring Boot程式過程中會遇到的一些細節和基本觀念。了解這些觀念能幫助我們正確設置 Spring,避免在程式寫好(或根本還沒開始寫)時,就因設定不當而遇到一堆問題卡關。

Citation

https://docs.spring.io/spring-boot/how-to/hotswapping.html


上一篇
使用 Spring Boot 開發 Backend Bot Server: Kafka Consumer 客製化配置與訊息接收
下一篇
使用 Spring Boot 開發 Backend Bot Server: 使用 Spring Data 連接 MongoDB
系列文
從零開始構建能理解語義的 Linebot 架構30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言