針對 Java 初學者常見困惑:JDK 不是 IDE、環境變數怎麼設、為什麼沒有 .exe、如何打包發布。本文以現代視角重新整理,補充當前最佳實踐。
建議:新手直接安裝 IntelliJ IDEA Community Edition(免費)或 VS Code + Extension Pack for Java,內建 JDK 管理、建構工具整合,避免手動設定環境變數的痛苦。
JAVA_HOME = C:\Program Files\Java\jdk-21(你的 JDK 安裝路徑)Path → 新增 %JAVA_HOME%\binjava -version、javac -version現代 Java 幾乎不需要手動設定 CLASSPATH 環境變數。
.(當前目錄)已在搜尋路徑javac -cp、java -cp 指定類別路徑# Windows 批次檔暫時設定
set CLASSPATH=.;C:\jdk1.3.1\lib\tools.jar;C:\myproject\classes
# Linux/macShell
export CLASSPATH=.:/usr/local/jdk/lib/tools.jar:/myproject/classes
| 錯誤 | 原因 | 解決 |
|---|---|---|
| ClassNotFoundException | 執行期找不到類別(Class.forName、ClassLoader.loadClass) | 檢查 classpath 是否包含該類別所在目錄/jar |
| NoClassDefFoundError | 編譯期存在、執行期找不到(靜態初始化失敗、版本衝突) | 檢查依賴版本、static 區塊例外 |
| 大小寫不符 | Java 區分大小寫 | 類別名 PascalCase、檔名同類別名、指令正確大小寫 |
Java 編譯產生 位元碼,由 JVM 解釋執行,實現「撰寫一次、到處執行」。.exe 是 Windows 專屬機器碼(PE 格式),無法在 Linux/macOS 執行。
若需原生執行檔:
mvn spring-boot:build-image 產生 Docker 映像或原生映像# 編譯
javac -d out src/com/example/Main.java
# 建立 Manifest(指定主類別)
echo "Main-Class: com.example.Main" > manifest.txt
# 打包
jar cfm app.jar manifest.txt -C out .
# 執行
java -jar app.jar
<!-- pom.xml -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.example.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.1</version>
<executions>
<execution>
<phase>package</phase>
<goals><goal>shade</goal></goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
mvn clean package
# 產生 target/app-1.0.jar (含所有依賴,可直接 java -jar)
# 產生 Windows .msi / .exe、macOS .dmg / .pkg、Linux .deb / .rpm
jpackage --input target --main-jar app-1.0.jar --name MyApp --main-class com.example.Main --type msi