亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 運行時如何找到我的主類?

Java 運行時如何找到我的主類?

慕哥9229398 2023-02-23 15:45:51
我正在學習 Spring Boot。我做了一個簡單的 Spring Boot 項目,可以在http://localhost:8080/welcome輸出一個 hello world 字符串我使用 Maven 構建我的項目,該項目將輸出一個 jar 文件。要啟動我的 spring boot 應用程序,我使用如下命令java -jar my-springboot-app.jar我的問題是:Java 是如何智能到足以定位我的主類及其主要方法(例如應用程序啟動器)的?我檢查了 jar 文件并瀏覽了那些 BOOT-INF 和 META-INF,但找不到任何線索。spring boot 框架 (@SpringBootApplication) 或 maven 會自動為我施展魔法嗎?
查看完整描述

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 中配置插件屬性以指定正確的類。


查看完整回答
反對 回復 2023-02-23
?
達令說

TA貢獻1821條經驗 獲得超6個贊

Java 類在更大的上下文中執行,您運行 java -jar somejar.jar將在 .jar 文件的清單中選擇有問題的類。

@SpringBootApplication 將有componentscan,啟用自動配置(autowired)

componentscan - 識別包中的所有控制器、服務和配置類。


查看完整回答
反對 回復 2023-02-23
  • 2 回答
  • 0 關注
  • 195 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號