close

最近的專案使用了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=org.springframework.boot.loader.PropertiesLauncher

這樣就可以在Spring boot中,呼叫的特定包含main的程式了。

arrow
arrow
    創作者介紹
    創作者 JAVA Programmer 的頭像
    JAVA Programmer

    台灣的Web工程師

    JAVA Programmer 發表在 痞客邦 留言(0) 人氣()