2 回答
TA貢獻1825條經驗 獲得超4個贊
在 spring boot jar 的情況下,事情比普通 jar 復雜一點。主要是因為 spring boot applicaton jar 并不是真正的 JAR(我所說的 jar 是指具有清單和編譯類的東西)。常規 JAR 可以被 jvm“識別”和處理,但是在 Spring Boot 中也有打包的依賴項(看一看BOOT-INF/lib),因此它的 jars 在 JAR 中。如何閱讀這個?
事實證明,spring boot 總是有自己的主類,它確實在 MANIFEST.MF 中被引用,這是打包應用程序的真正入口點。
清單文件包含以下幾行:
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.example.demo.DemoApplication
Main-Class是 JVM 入口點。這個由 spring 開發人員編寫的類基本上做了兩件事: - 建立一個特殊的類加載器來處理 spring boot 應用程序的“非常規 jar”特性。由于這種特殊的類加載器,BOOT-INF/lib可以處理包含“jars”的 spring boot 應用程序,例如,常規的 java 類加載器顯然不能這樣做。- 調用main方法的Start-Class值。這Start-Class是 spring boot 應用程序獨有的東西,它表示包含“main”方法的類 - 您編寫的類和您認為是入口點的類 :) 但從 spring boot 基礎設施的角度來看,它只是具有“普通”主要方法的類 - 可以通過反射調用的方法。
現在關于“誰構建清單”的問題:
此 MANIFEST.MF 通常由 Spring 開發人員為 Maven 或 Gradle 等構建系統提供的插件自動創建。
例如,插件看起來像這樣:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
在其工作期間,此插件會標識您的主類(com.example.demo.DemoApplication在我的示例中)。這個類用@SpringBootApplication注釋標記并且有一個public static void main方法。但是,如果您放置許多這樣的類,插件可能無法識別正確的類,因此您需要在 POM.xml 中配置插件屬性以指定正確的類。
TA貢獻1821條經驗 獲得超6個贊
Java 類在更大的上下文中執行,您運行 java -jar somejar.jar將在 .jar 文件的清單中選擇有問題的類。
@SpringBootApplication 將有componentscan,啟用自動配置(autowired)
componentscan - 識別包中的所有控制器、服務和配置類。
添加回答
舉報
