JavaRush /Java Blog /Random-TW /無需 IDE 即可編譯並執行 Java
Ve4niY
等級 14

無需 IDE 即可編譯並執行 Java

在 Random-TW 群組發布
有一次在reddit.com上,在沒有 IDE 的情況下編譯和運行 Java主題中,有人提出了這樣的問題:是否有一個命令可以將包內的一組Java 文件編譯到單獨的資料夾中(我們稱之為bin) ,以及我將如何啟動新的類別文件?」 不使用 IDE 編譯和運行 Java - 1主題作者kylolink解釋道:「當我開始使用 Java 時,我依靠 Eclipse 為我完成所有編譯工作,只是擔心編寫程式碼。」我已經多次看到這個問題,而且確實,這個是什麼促使我寫博客文章GPS 系統和IDE:好還是壞?我喜歡強大的現代Java IDE,它們讓我的日常生活變得更輕鬆,但是了解如何構建和運行簡單的Java 示例也有好處他們。這篇文章是關於如何做到這一點的。在我關於透過簡單測試學習Java 的部落格中,我寫了我有時喜歡使用簡單的文字編輯器和命令列工具來編寫、建立和運行簡單的應用程式。我有現在,我很清楚我最喜歡的Java IDE 需要多少“開銷”,並儘早決定使用該框架所獲得的好處是否足以證明“開銷”的合理性。在大多數實際應用中,毫無疑問VL IDE的價值不菲。然而,對於最簡單的範例應用程式來說,情況並非總是如此。本文的其餘部分將展示如何在這些情況下在沒有 IDE 的情況下建立和運行 Java 程式碼。

編寫和執行 Java 程式碼

為了使範例更加清晰,我將使用一些非常簡單的 Java 類,這些類別透過組合或繼承相互關聯,並且位於名為dustin.examples的同一個套件中。兩個類別缺少一個函數main;第三個類別 Main.java 有一個函數main,可讓您示範如何在沒有 IDE 的情況下運行該類別。下面是這三個類別的程式碼: Parent.java
package dustin.examples;

public class Parent
{
   @Override
   public String toString()
   {
      return "I'm the Parent.";
   }
}
孩子.java
package dustin.examples;

public class Child extends Parent
{
   @Override
   public String toString()
   {
      return "I'm the Child.";
   }
}
主程式.java
package dustin.examples;

import static java.lang.System.out;

public class Main
{
   private final Parent parent = new Parent();
   private final Child child = new Child();

   public static void main(final String[] arguments)
   {
      final Main instance = new Main();
      out.println(instance.parent);
      out.println(instance.child);
   }
}
下面的螢幕截圖顯示了這些.java類別的目錄結構。此螢幕截圖顯示原始檔案位於代表套件名稱的目錄層次結構中(dustin/examples,因為套件資訊是dustin.examples),並且該套件反映了目錄層次結構位於子目錄SRC 下。我還建立了一個classes 子目錄(目前為空)來存放已編譯的.class文件,因此當目錄不存在時Javac不會建立該目錄。

使用 JAVAC 建置並使用 Java 運行

無論使用哪種方法建立 Java 程式碼(Ant、Maven、Gradle 或 IDE),最終都歸結為 JAVAC。Oracle/Sun 提供的 JAVAC 命令列工具中的標準選項可以透過執行 JAVAC -help 查看,其他擴充選項可以透過執行 JAVAC -help -X 來查看。有關如何使用這些選項的更多詳細信息,請參閱適用於 Windows 或 Unix/Linux 的 JAVAC 工具文件。如 Javac 文件所述,-sourcepath 選項可用於表示來源檔案所在的目錄。在上面的螢幕截圖中顯示的目錄結構中,這意味著,假設我從C:\Java\examples\javacAndJava\ 目錄運行 JAVAC 命令,我的命令中必須有類似的內容:Javac -sourcepath src SRC\Dustin \examples\*. 爪哇。以下螢幕截圖顯示了此操作的結果。 不使用 IDE 編譯和運行 Java - 2因為我們沒有為.class檔案指定目錄,所以它們預設放置在與組成它們的來源.java檔案相同的目錄中。我們可以使用該選項-d來解決這種情況。我們的指令現在可以運行,例如Javac -sourcepath src -d classes src\Dustin\examples\*。我你。如前所述,所選資料夾(類別)必須已存在。當發生這種情況時,該命令會將.class檔案放置在指定的資料夾中,如下圖所示。 不使用 IDE 編譯和運行 Java - 3將 Java 原始檔編譯為指定目錄中對應的.class檔案後,我們可以使用該應用程式的快速啟動選單來啟動應用程式Java 命令列工具。只需按照 Java 說明或 Java 工具頁面上提供的說明並使用( 或) 選項指定.class檔案的位置即可完成此操作。以下螢幕截圖示範了使用這兩種方法來指定查找.class檔案的類別目錄。最後一個參數是具有要執行的 main 函數的類別的完整(整個 Java 套件)名稱。以下螢幕截圖中示範的指令是 java classes -cpdustin.examples.Main 和 java classes -classpathdustin.examples.Main。 -classpath-cp不使用 IDE 編譯和運行 Java - 4

使用 Ant 建置和運行

對於最簡單的 Java 應用程序,使用 JAVAC 和 Java 分別創建和運行應用程式是相當容易的,正如剛剛演示的那樣。隨著應用程式變得更加複雜(例如,程式碼存在於多個套件/目錄中,或者第三方程式庫和框架上存在更複雜的依賴類別),這種方法可能會變得笨拙。Apache Ant 是「三巨頭」Java 建置工具中最古老的,已在數千個應用程式和部署中使用。正如我在之前的部落格文章中所說,一個非常簡單的 Ant 建立文件很容易創建,特別是如果它以我在這篇文章中概述的模板開始的話。以下程式碼清單適用於 Ant 的build.xml文件,該文件可用於將.java文件組合為 .class 文件,然後運行類dustin.examples.Main,就像上面使用 JAVAC 和 Java 所做的那樣。 建置.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="BuildingSansIDE" default="run" basedir=".">
   <description>Building Simple Java Applications Without An IDE</description>

   <target name="compile"
           description="Compile the Java code.">
      <javac srcdir="src"
             destdir="classes"
             debug="true"
      includeantruntime="false" />
   </target>

   <target name="run" depends="compile"
           description="Run the Java application.">
      <java classname="dustin.examples.Main" fork="true">
         <classpath>
           <pathelement path="classes"/>
         </classpath>
      </java>
   </target>
</project>
我沒有使用 Ant 屬性,也沒有包含我通常包含的共同目標(例如“pure”和“Javadoc”),以使此範例盡可能簡單,並使其與前面使用 JAVAC 和 Java 的範例保持接近。另請注意,我已將 JAVAC Ant 任務的“debug”設為“true”,因為在 Ant 失敗的情況下這不是真的,但在 JAVAC 的預設情況下卻是這樣。毫不奇怪,Javac 任務和 Java Ant 任務類似於 JAVAC 命令工具和 Java。因為我使用了預設名稱Ant 在未明確指定時需要一個建置檔案(build.xml),並且因為我提供了“Run”目標作為此建置的“預設”,並且因為我將“compile”包含為依賴項執行「Run」目標,並且因為 Ant 位於我的環境路徑上,所以我在命令列上所要做的就是讓 Ant 編譯並執行包含build.xml檔案的目錄中的 ant 範例。這如下面的螢幕截圖所示。 不使用 IDE 編譯和執行 Java - 5儘管我已經演示了使用 Ant 編譯和運行一個簡單的 Java 應用程序,但我傾向於僅使用 Ant 進行編譯並使用 Java 運行(或者如果類路徑很重,則使用調用 Java 的腳本)。

使用 Maven 建置和運行

儘管 Ant 是第一個核心 Java 建置工具,但 Apache Maven 最終贏得了聲譽,很大程度上是因為它採用了基於約定的配置和對共享庫儲存庫的支援。當程式碼和產生的物件遵循其標準目錄佈局時,Maven 很容易使用。不幸的是,我的範例沒有遵循這個目錄結構,但 Maven 確實允許我們覆蓋預期的預設目錄結構。以下是 Maven POM 檔案的程式碼列表,該檔案用於取代來源目錄和目標目錄,並提供使用 Maven 3.2.1 進行 Maven 建置所需的其他最低元素。 pom.xml
<project>
   <modelVersion>4.0.0</modelVersion>
   <groupId>dustin.examples</groupId>
   <artifactId>CompilingAndRunningWithoutIDE</artifactId>
   <version>1</version>

   <build>
      <defaultGoal>compile</defaultGoal>
      <sourceDirectory>src</sourceDirectory>
      <outputDirectory>classes</outputDirectory>
      <finalName>${project.artifactId}-${project.version}</finalName>
   </build>
</project>
由於上面的pom.xml檔定義了“compile”的“defaultGoal”,並且因為pom.xml檔是Maven 可執行檔(MVN)查找的預設POM 自訂,並且因為Maven 安裝bin 目錄位於我的路徑上,所以僅我需要運行“MVN”來編譯 .class 文件,如下面的螢幕截圖中所述。 不使用 IDE 編譯和運行 Java - 6我也可以使用 Mvn Exec 命令從 Maven 執行已編譯的應用程式: Java -Dexec.mainClass =dustin.examples.Main,如以下螢幕截圖所示。 在沒有 IDE 的情況下編譯和執行 Java - 7與 Ant 一樣,我傾向於不使用 Maven 來運行簡單的 Java 應用程序,而是在已編譯的程式碼上使用 Java(或使用直接在長類上呼叫 Java 的腳本)。

使用 Gradle 建置和運行

Gradle 是三大 Java 建置工具中最新、最受歡迎、最時尚的。我有時對流行的本質持懷疑態度,但我發現 Gradle 有很多值得喜歡的地方(用 Groovy 而不是 XML 編寫、內置 Ant 支援、內置 Ivy 支援、按慣例配置很簡單)重新配置、Maven 存儲庫支援等)。以下範例顯示了一個 Gradle 構建,可用於編譯和運行一個簡單的應用程序,這是本文的主要範例程式碼。我在 Simple Gradle Java Plugin Customization 部落格上介紹了這個改編範例。 建構.gradle
apply plugin: 'java'
apply plugin: 'application'

// Redefine where Gradle should expect Java source files (*.java)
sourceSets {
    main {
        java {
            srcDirs 'src'
        }
    }
}

// Redefine where .class files are written
sourceSets.main.output.classesDir = file("classes")

// Specify main class to be executed
mainClassName = "dustin.examples.Main"

defaultTasks 'compileJava', 'run'
build.gradle檔案 的前兩行指示 Java 插件和應用程式插件的使用,從而導致一系列功能自動建置到此建置中。定義「sourceSets」和「sourceSets.main.output.classesDir」可讓您分別覆寫 Gradle 外掛程式的 Java 原始碼和編譯的二進位類別的預設 Java 目錄。「MainClassName」可讓您明確指定應在應用程式外掛程式。「defaultTasks 」行定義了只需在命令列上鍵入「Gradle」即可運行的任務:「compileJava」是Java 插件提供的預設任務,「Run」是應用程式插件提供的預設任務。因為我將組件命名為build.gradle,這就是為什麼我將預設任務指定為“compileJava”和“Run”,並且因為我的路徑中有Gradle 安裝bin 目錄,所以建置和運行範例所需要做的就是鍵入“Gradle”,這在下面的螢幕截圖中得到了演示。 不使用 IDE 編譯和運行 Java - 8即使是最大的懷疑論者也必須承認,對於這個簡單的例子來說,Gradle 建置非常不穩定。它將依賴某些約定和假設的簡潔性與在必要時覆蓋預設值的非常簡單的機制結合起來。事實上它是在 Groovy 而不是 XML 中,這一點也非常有吸引力!與 Ant 和 Maven 一樣,我傾向於僅使用這些工具進行構建,並且傾向於直接從 Java 或調用 Java 的腳本運行已編譯的 .class 檔案。順便說一句,我傾向於將這些 .class 歸檔到 jar 中以供啟動,但這超出了本文的範圍。

結論

IDE 通常不是建立簡單應用程式和範例所必需的,而且可能比建立簡單範例的成本還要昂貴。在這種情況下,使用JAVAC和Java直接建置和執行範例是相當容易的。作為更多參與的例子,A​​nt、Maven 或 Gradle 等建置工具變得更有吸引力。事實上,許多開發環境都支援這些建置實用程序,這意味著如果開發人員確定在簡單的應用程式成長為成熟的專案時需要 IDE 支持,則可以使用在此過程之前建立的內建工具遷移到 IDE 。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION