spring boot 項(xiàng)目如何加載外部 jar 包?
在模塊化開(kāi)發(fā)中,spring boot 項(xiàng)目經(jīng)常需要加載外部 JAR 包來(lái)擴(kuò)展功能。例如,一個(gè) Spring Boot 項(xiàng)目可能需要根據(jù)客戶需求加載不同的功能模塊,這些模塊可以打包成獨(dú)立的 JAR 包。本文將介紹如何在 Spring Boot 項(xiàng)目啟動(dòng)時(shí)加載外部 JAR 包。
假設(shè)一個(gè) Spring Boot 項(xiàng)目通過(guò)掃描二維碼查詢不同類型的信息(例如樹(shù)、道路或物品)。為了滿足不同客戶的需求,項(xiàng)目被拆分成多個(gè)模塊:核心模塊(包含基礎(chǔ)服務(wù))和多個(gè)功能模塊(每個(gè)模塊處理一種類型的信息)。部署時(shí),只需要加載對(duì)應(yīng)的功能模塊 JAR 包即可。
直接使用 Java -xbootclasspath/a:file:./libs -jar main.jar、java -djava.ext.dirs=file:./libs -jar main.jar 和 java -dloader.path=file:./libs -jar main.jar 等方式加載外部 JAR 包都會(huì)失敗,因?yàn)?-jar 選項(xiàng)會(huì)忽略 -cp、-classpath、-xbootclasspath 以及系統(tǒng)屬性 java.ext.dirs 和 loader.path 等參數(shù)。
有效的解決方法是利用 Spring Boot 啟動(dòng)器的特性,直接指定類路徑:
java -classpath './libs/*;main.jar' org.springframework.boot.loader.JarLauncher # or java -cp './libs/*;main.jar' org.springframework.boot.loader.JarLauncher
其中 ./libs/* 表示加載 libs 目錄下的所有 JAR 包,main.jar 是 Spring Boot 應(yīng)用的 JAR 包。Spring Boot 打包后,其主類變?yōu)?org.springframework.boot.loader.JarLauncher,因此需要顯式指定該類來(lái)啟動(dòng)應(yīng)用。 -jar 和 -classpath 參數(shù)是互斥的,使用 -jar 時(shí) -classpath 參數(shù)會(huì)被忽略,所以必須直接指定主類并使用 -classpath 指定所有需要的 JAR 包,包括 Spring Boot 應(yīng)用自身的 JAR 包。