如何編譯 Java 程式:初學者友善指南,涵蓋 javac、PATH 設定與常見錯誤

當你開始學習 Java 時,最先遇到的障礙就是「編譯」。僅僅寫下源碼 (.java) 並不會執行任何程式——你必須使用 javac 指令編譯,產生 .class 檔,只有這樣程式才可執行。在本文中,我們總結了 Java 編譯流程、javac 的基本用法、PATH 設定,以及常見初學者錯誤的解決方案——以一個即使是完全新手也能一步步跟隨的流程呈現。目標是從「Java 編譯到底從哪裡開始?」過渡到自信地輸入指令而不再猶豫。

什麼是 Java 編譯?|適合初學者的「編譯」說明

在 Java 中,「編譯」是將人類撰寫的源碼 (.java) 轉換為 Java 虛擬機(JVM)可讀格式的過程。
產生的輸出是 .class 檔,稱為位元組碼。

與直接編譯為本機程式碼的 C 等語言不同,Java 先進行中間步驟——源碼先被轉換為位元組碼,然後在 JVM 上執行。
這種機制使得相同的 .class 檔能在不同作業系統環境中執行——也就是說,你可以在 Windows、macOS 或 Linux 上執行完全相同的 Java 程式

另一個你必須理解的重要概念:編譯與執行是分開的動作

  • “javac” → 處理編譯
  • “java” → 處理執行

大多數初學者失敗的原因是這種區分對他們來說不夠明確。澄清這兩個「不同角色」成為你理解過程中最有效的第一步。

編譯 Java 前所需的準備

要編譯 Java,你必須安裝 JDK(Java 開發工具包)
僅有 JRE 無法編譯程式碼,因為編譯器工具 javac 只包含在 JDK 中。

先檢查以下指令:

javac -version

如果此指令回傳版本號,表示一切正常。
若顯示「command not found」或類似錯誤,以下情況很可能是原因:

  • 未安裝 JDK
  • 已安裝 JDK 但未設定 PATH
  • 只安裝了 JRE(沒有開發工具包)

PATH 設定是日本使用者最容易卡住的地方。
若作業系統無法辨識到 javac.exe(或 /bin 目錄)的完整路徑,編譯將無法進行。

結論:
「準備 JDK」與「驗證 PATH」——只有這兩項就緒,你才能站在 Java 編譯的真正起點。

讓我們實際編譯一個 Java 檔案

在此,我們將建立一段範例程式碼,並確認使用 javac 編譯的流程。
首先,使用文字編輯器儲存以下內容。

Sample.java

public class Sample {
    public static void main(String[] args) {
        System.out.println("Hello Java!");
    }
}

檔名必須為 Sample.java,且 public 類別名稱必須與檔名相同
若違反此規則,編譯將失敗——這是最常見的初學者錯誤之一。

接著,在終端機/命令提示字元執行以下指令:

javac Sample.java

若一切正常執行,Sample.class 將在同一資料夾產生。
這表示「編譯完成」。

此時,情況如下:

  • Sample.java(源碼)
  • Sample.class(位元組碼)

此對已準備就緒。
此階段,你已準備好「執行 Java 程式」。

編譯後如何執行

編譯完成後,下一步是執行 .class 檔。
此處使用的指令是 java——而非 javac

java Sample

重點:不要寫上 .class 副檔名
寫成 java Sample.class 會產生錯誤。
Java 會根據類別名稱(不含副檔名)執行。

整理摘要:

RoleCommandTarget
Compilejavac Sample.java.java file
Runjava SampleClass name (without extension)

若你已理解 javacjava 之間的角色切換,即已突破初學者階段。

如果「Hello Java!」成功顯示,表示流程已經完成。此時你已經掌握了 Java 的最小「流程」。

常見錯誤與修正方法

在 Java 編譯過程中,剛開始遇到錯誤是完全正常的。
這裡我們只聚焦於日本初學者特別容易犯的錯誤。

1) javac: command not found / 'javac' is not recognized…

在幾乎 100% 的情況下,原因是以下其中之一:

  • JDK 未安裝
  • PATH 未設定

修正方法:
執行 javac -version 以確認
→ 若沒有任何輸出,請重新安裝 JDK 並檢查 PATH 設定。

2) 編譯成功但未產生 .class 檔案

日本初學者最常遇到的問題是:
檔名與 public class 名稱不一致

範例 — 若 Sample.java 包含:

public class Test {
}

→ 這將導致編譯錯誤。

3) 與字元編碼相關的警告

warning: [options] bootstrap class path not set in conjunction with -source 1.7

這類警告在大多數情況下並不致命。
然而,它們可能表示使用了舊版設定或編碼不一致。
以 UTF-8 儲存檔案 是最安全的選擇。

使用 IDE 進行編譯

在實際的 Java 開發中,你很少需要每次都在終端手動輸入 javac
原因是 IDE(整合開發環境)會在背景自動處理編譯

以下三個 IDE 在日本非常受歡迎,同時也適合學習:

IDECharacteristics
IntelliJ IDEAThe de-facto standard for modern Java development. Suitable for professional use.
EclipseLong history, widely used in enterprise projects.
VSCodeLightweight. Java Extension Pack enables a proper Java environment.

在 IDE 中,每次儲存檔案時編譯都會自動進行,且錯誤位置會即時顯示。
這意味著你可以避免「打錯 javac」或「PATH 設定錯誤」等初學者障礙。

然而,至少一次親自體驗 javac 的價值仍然很大,以便了解 Java 的運作方式。
當你手動體驗「編譯 → 執行」流程後,轉向 IDE 開發時的理解速度會大幅提升。

javac 選項基礎

javac 不只是「.java → .class 轉換器」。你可以附加多個選項來控制編譯行為。
但在初學階段,你不需要記住所有選項——只要掌握常用的即可。

以下是三個代表性的選項:

OptionMeaningExample
-dSpecify output directory for .class filesjavac -d out Sample.java
-classpathSpecify classpath for external libraries / other directoriesjavac -classpath lib/* Sample.java
--enable-previewEnable preview language featuresjavac --enable-preview Sample.java

特別是 -d 在使用 package 時幾乎是必須的。
例如,若你寫 package com.example;,必須使用 javac -d 以正確產生輸出目錄下的目錄結構。

進入實務工作後,classpath 指定與 -d 的使用量會大幅增加
在此階段僅了解這些名稱,將使後續學習更順利。

小結

要執行 Java 程式,你必須了解三個步驟:寫程式碼 → 編譯 → 執行
特別是如果你在心中將 javac(編譯)與 java(執行)分開來看,為什麼需要編譯的原因就會立刻明白。

此外,初學者通常會卡在以下兩個點:

  • JDK 未安裝 / PATH 未設定
  • 檔名與 public class 名稱不一致

只要解決這兩個問題,你就能避免學習過程中的大幅迴避。
熟悉基礎後,轉向 IDE 開發完全沒問題。
然而,是否「了解內部機制」才是後續理解速度差異的關鍵。

以本文作為起點,先成功完成一次 .java → .class
這就是學習 Java 的第一個成就里程碑。

FAQ:Java 編譯常見問題

Q1: javacjava 有什麼差別?
A: javac 是編譯指令——將 .java 轉換為 .class
 另一方面,java 是執行指令——在 JVM 上執行 .class

Q2: Sample.class 未生成。原因是什麼?
A: 最常見的原因是檔名與 public class 名稱不一致。
 如果類別是 public class Sample,則檔案必須是 Sample.java

Q3: 如果我使用 IDE,是否不需要再學習 javac?
A: IDE 會在背景自動編譯,但若不了解其機制,會更難掌握實際發生的過程。
 親身體驗一次基本流程能更快理解 IDE 的行為。

Q4: 我應該安裝哪個 JDK?
A: 對初學者而言,Temurin(Eclipse Adoptium)LTS 版本最易使用。
 若沒有特殊需求,建議選擇 Java 17 或 21。

Q5: 我收到 javac: command not found
A: 可能是 JDK 未安裝或 PATH 未設定。
 先執行 javac -version 以確認是否已被辨識。