沒了 IDE,你的 Java 項目還能 Run 起來嗎?

計算機智能識別機器碼0101...編程語言->能執行的機器碼 需要經過 預處理->編譯->彙編->鏈接->機器碼 過程。一個語言處理系統的示意圖如下:

沒了 IDE,你的 Java 項目還能 Run 起來嗎?

編譯器是將 源語言程序一次性翻譯 成一個等價的,用目標語言編寫的程序。還存在另一種常見的語言處理器, 解釋器 :它是 逐個語句的執行源語言程序 。由一個編譯器產生的目標語言程序通常比一個解釋器快,但解釋器的錯誤診斷效果通常更好。

Java語言處理器結合了編譯和解釋的過程。一個 .Java 源程序首先被編譯為 .class 字節碼文件,被加載到虛擬機中,然後由虛擬機將字節碼翻譯成機器碼。

沒了 IDE,你的 Java 項目還能 Run 起來嗎?

虛擬機的好處在於:一旦一個程序被轉換成 Java 字節碼,那麼它便可以在不同平臺上的虛擬機實現裡運行。實現 一次編寫,到處運行 。另外一個好處是它帶來了一個 託管環境 。這個託管環境能夠代替我們處理一些代碼中冗長而且容易出錯的部分,如自動內存管理與垃圾回收。

在Hotspot中, 虛擬機翻譯字節碼 有兩種方式:

1.解釋執行:即逐條將字節碼翻譯成機器碼並執行。

2.即時編譯:即將一個方法中包含的所有字節碼編譯成機器碼後再執行。

前者的優勢在於無需等待編譯,而後者的優勢在於實際運行速度更快。HotSpot 默認採用混合模式,綜合瞭解釋執行和即時編譯兩者的優點。它會先解釋執行字節碼,而後將其中反覆執行的熱點代碼,以方法為單位進行即時編譯。

即時編譯建立在程序符合二八定律的假設上,也就是百分之二十的代碼佔據了百分之八十的計算資源。

好了,裝X結束。

沒了 IDE,你的 Java 項目還能 Run 起來嗎?

阿姨知道的編譯知識全在上面了。。(っ╥╯﹏╰╥c)

如題,下面我們來看一下讓Java項目運行起來我們能做什麼。

我們能做的很簡單,當然不是寫虛擬機。我們只需要:

  1. 執行 command javac ,將.Java文件變為.class文件。
  2. 執行 command java ,讓.class文件運行起來。

也就是 執行command :)

Java程序的運行方式

Java程序可以通過java命令 運行.class文件運行可執行Jar文件 。我們先看第一種方式:從Hello World開始。

運行.class文件

Step1:編寫Java文件

沒了 IDE,你的 Java 項目還能 Run 起來嗎?

Step2:執行 command javac

將.java文件變為.class文件

沒了 IDE,你的 Java 項目還能 Run 起來嗎?

小貼士:class文件的全路徑名是包名目錄+ 類文件名。

Step3:執行 command java

運行.class文件

沒了 IDE,你的 Java 項目還能 Run 起來嗎?

神奇,我們沒有用IDE讓Java程序運行起來了 :)

小夥伴先別噴老阿姨,哪特麼有這麼簡單的Java項目啊。。我們工作中用的明明都是Jar文件啊... Jar文件咋運行啊!!

沒了 IDE,你的 Java 項目還能 Run 起來嗎?

運行可執行Jar文件

Jar文件是基於ZIP文件格式的一種文件格式,它將大量的Java類文件、相關的元數據和資源(文本、圖片等)文件聚合到一個Jar文件中,此外還包含一個可選的

META-INF文件夾 。這個文件夾下的文件或文件夾主要用來打包和擴展配置信息,包括安全,版本,擴展程序和服務等。如 MANIFEST.MF 文件定義了擴展和打包的相關數據信息。一個Jar文件通常在項目中用作第三方類庫使用,也是項目構建的一部分。

生成一個Jar文件大致分為兩步:

1.將源文件編譯為.class文件

2.通過 command jar 命令,將.class文件,資源文件等等打成一個文件格式的Jar文件。

我們以一個SbDemo項目為例來看Jar文件的打包和運行。項目目錄結構如下:

沒了 IDE,你的 Java 項目還能 Run 起來嗎?

Test2.java中調用了Test1.java的方法

沒了 IDE,你的 Java 項目還能 Run 起來嗎?

我們需要先 將Test1.java編譯並打成一個Test1.jar文件,然後通過Test1.jar將Test2.java編譯並打成一個可執行的Test2.jar文件 。

可執行和不可執行的Jar文件 區別在於是否在Jar文件中指定了main方法的入口,我們後面再看。

Step1:Test1.java的編譯

沒了 IDE,你的 Java 項目還能 Run 起來嗎?

Step2:將編譯後的classes/com/Test1.class文件打成一個Test1.jar包

Java中和jar包相關的命令是 jar命令 ,生成一個jar包我們需要定義 信息文件(manifest-file),它可以定義所生成jar包的classpath類搜索路徑,jar包的入口類等等。可以理解為 與Jar包相關的元數據配置信息

Step2.1 書寫信息文件

這裡我們使用 resources/manifest-test1.text文件 作為信息文件

沒了 IDE,你的 Java 項目還能 Run 起來嗎?

是的,Test1.java太簡單了,就是打成一個可被他人引用的jar包,信息文件不重要。

Step2.2 執行打包命令

沒了 IDE,你的 Java 項目還能 Run 起來嗎?

Step3. 編譯Test2.java文件

因為Test2.java中引用了com.Test1類,所以我們需要在編譯時指定Classpath路徑。 Classpath:顧名思義,是指待編譯類依賴的類所在路徑位置。我們可以通過 javac 的 -cp 參數指定。

關於 編譯時classpath的值優先級 如下:

  • 如果沒有傳入classpath參數,將使用環境變量CLASSPATH的值。(小夥伴不知道環境變量咋查看和設置?去看阿姨的上一篇文章:)
  • 如果沒有發現環境變量CLASSPATH,將使用 執行命令的當前文件夾(.)。
  • 如果javac命令行 通過 -classpath or -cp 參數指定了類路徑值,則優先級最高。

這裡我們使用-cp指定Test1.jar所在位置

沒了 IDE,你的 Java 項目還能 Run 起來嗎?

可以看到classes目錄下已經生成了com2/Test2.class文件了。

Step4. 將編譯後的Test2.class和它依賴的Test1.jar一起打成一個可執行的Jar包

Step4.1 書寫信息文件

這時候我們使用信息文件resources/manifest-test2.text文件指定這些信息

沒了 IDE,你的 Java 項目還能 Run 起來嗎?

Step4.2 執行Jar包生成命令

沒了 IDE,你的 Java 項目還能 Run 起來嗎?

可以看到在lib目錄下生成了Test2.jar

Step5.運行我們的可執行Jar

沒了 IDE,你的 Java 項目還能 Run 起來嗎?

大功告成了,我們的SbDemo項目Run起來了...

當然實際項目不可能人肉編譯,打包。我們需要通過Maven/Gradle等構建工具,幫助我們管理代碼之間的Jar包依賴,構建,部署...我們可能大多時候通過點一下IDE就託管了Maven的構建部署命令。

拿Maven舉例子,Maven首先定義了一套項目結構,我們按照它的結構書寫代碼,引入各個模塊所需要的Jar包依賴。然後Maven可以通過自己的生命週期管理項目的清理,構建,打包,部署階段。每個階段有對應的Maven插件執行相應的目標。IDE又整合了Maven,使我們通過點吧點吧按鈕就完成了項目的運行。

但是當一個項目並沒有按照規範的構建工具結構搭建,或者項目沒有成功運行報錯時,瞭解Java實際的編譯運行過程會對理解、解決這類問題有所幫助。

文中提到的命令均可通過 command -help 進一步瞭解可用參數,如 javac -help ~


分享到:


相關文章: