java程式碼-編譯-打包-執行_雲原生時代筆記總結

oennn欧冷發表於2024-09-18
  • 楔子:可能201幾年開發的時候,有個ide,加上打包外掛,就可以開發了,測試的時候war包扔到伺服器容器裡就可以跑起來了。
    • (而且沒有做過批處理的小夥伴對jar包執行可能不甚熟悉,只見過web容器的目錄結構和lib中的jar包。)
    • 但是2015年之後應該是全面進入,雲原生時代。大量操作需要linux命令列和shell指令碼。tomcat也內嵌到spring boot中去啟動。
    • Java官網去找資料可能就一個helloworld
    • 網上的部落格,都是遇到才寫一個單一的打包命令。內容分散,治標不治本。
    • 所以我把java編譯打包執行整理在一起。,然後和spring-boot打包也比較一下。

  • 編譯-打包-執行步驟總結如下:
  1. 編寫Java程式碼
  2. 編譯class檔案
    • javac -d destination_folder Helloxx.java multisource/*.java source_folder2/*.java -cp imported_neededcompile_neededxx.jar
  3. jar包打包或者war包
    • jar包就是class檔案的壓縮包,然後裡面會有一個MANIFEST.MF的元資訊檔案。可以包含或者不包含如main-class的配置。war包多了webapp類似這樣名稱的資料夾,給web伺服器解壓了之後使用,存放如web.xml的資訊。
    • 3.1 不指定自己的manifest
      jar -cvf buildedfilexx.jar -C classfolder/xx/ . (-C 表示不復制原始檔的資料夾目錄,class檔案都放在一個目錄下,資料夾後面都帶上/。. 表示當前資料夾下的class檔案
    • 3.2 指定自己的manifest文
      jar -cvfm buildedfile.jar my_manifest.mf classfolder/
  4. 執行jar包
    • 4.1 java -cp "/xxx/jarfilefolder/filexx.jar;xx/classfolder" XXMainclassname
    • 4.2 有main-class配置,直接執行jar包
      java -jar xx.jar (和-cp不能同時使用。springboot採用這種方式啟動)
  5. maven普通打包,透過package指定jar或者war,然後是打包外掛和compile外掛裡面做一些複製和排除的配置
  6. springboot比較
    • 一般都會有一個類裡面有註解@SpringbootApplication,然後在這個類裡面會有main方法,但是這個main方法不是最後打包出來的mainclass,mainclass一定是springboot自己的類作為入口的main-class。
    • 必須透過springboot的maven外掛進行打包,然後看maven依賴中的starter是否帶有web-starter,最後打包出來的雖然是jar包,但是jar裡內嵌了伺服器和打包出來的服務容器的目錄。
    • 除了web,也可以有@CommandLineRunner的方法,springboot的maven外掛打包的時候掃描程式碼中的註解,最後打包出來的jar也可以像上面的普通jar一樣執行。

  • 結語 從sre或者運維的角度看開發經驗的話,現象和原因不在一起,不能直觀的看到的時候,透過多次測試和長期觀察也不能確定真正的原因。
    • 如果不瞭解原理,也沒有實際的經驗,只是單純看別人的筆記或者部落格。就算是自己上手試試,也幾乎是盲人摸象。所以最好把原理現象操作總結在一起。

相關文章