最近的專案使用了Spring boot,其中有一個需求,是利用指令的方式,得到目前的版本,
因此特別寫了一支Main class,並回傳版本,利用Maven打包後,生成了二個JAR檔,
--
├ xxx-1.0-exec.jar
└ xxx-1.0.jar
第一個檔案是單機執行的版本,它將所有的Library包在一個檔案裡,第二個檔案是只包含自己寫的程式,並不包含Library,
正常的話,利用指令
java -jar xxx-1.0-exec.jar
即可正常執行整個Spring boot的程式。
遇到的問題:
因為有二個main程式,假設正常的main叫A,而另外要取得版本的程式叫B,如果要執行A的指令的話,
java -jar xxx-1.0-exec.jar -- 正常執行
java -jar xxx-1.0.jar -- 因為找不到Library,所以無法正常執行
如果要執行B程式的話
java -cp xxx-1.0-exec.jar B -- 因為找不到B,所以無法正常執行
java -cp xxx-1.0.jar B -- 正常執行
原因:
因為第一個xxx-1.0-exec.jar檔為Spring boot所用的JAR檔,所以整個檔案結構會有所不同,將它解開後,會發現
--
├ BOOT-INF/classes/B.class
而第二個xxx-1.0.jar檔為一般的JAR檔,所以檔案結構為:
--
├ B.class
很明顯是因為二個JAR檔的檔案位置不同所造成的。
解決方法:
在Spring boot的官網中,有談到如何解決這個問題:
java -
cp
bootApp.jar -Dloader.main=org.baeldung.DemoApplication org.springframework.boot.loader.PropertiesLauncher
套用在這次的範例中:
java -cp xxx-1.0-exec.jar -Dloader.main=
B org.springframework.boot.loader.PropertiesLauncher
這樣就可以在Spring boot中,呼叫的特定包含main的程式了。