答辯時老師要求不帶 Eclipse 直接運行項目?本文系統講解 Java 項目打包為可執行 JAR、無需 JRE 的 EXE、Maven 多模塊構建三大主流方案,涵蓋命令行操作、配置細節、常見坑點,助你從容應對各類部署場景。
# 1. 編譯源碼
javac -d out src/com/example/Main.java
# 2. 創建清單文件 manifest.txt
Main-Class: com.example.Main
Class-Path: lib/dependency1.jar lib/dependency2.jar
# 3. 打包
jar cvfm app.jar manifest.txt -C out .
# 4. 運行
java -jar app.jar
關鍵點:Main-Class 指定入口類全限定名;Class-Path 列出依賴 JAR 相對路徑(需與 app.jar 同級目錄)。
jpackage --input libs --main-jar app.jar --name MyApp --type exe<project>
<packaging>pom</packaging>
<modules>
<module>common</module>
<module>service</module>
<module>web</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.4.1</version>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.Application</mainClass>
</transformer>
</transformers>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals><goal>shade</goal></goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
執行 mvn clean package,在各模塊 target/ 生成可執行 Fat JAR(含所有依賴)。
File → Project Structure → Artifacts → + → JAR → From modules with dependencies,指定 Main Class,Build → Build Artifacts。Export → Java → Runnable JAR file,選擇 Package required libraries into generated JAR。src/main/resources,打包後通過 ClassLoader.getResourceAsStream() 讀取。META-INF/services/(SPI 機制),需用 maven-shade-plugin 的 ServicesResourceTransformer 合併。logback.xml, log4j2.xml) 必須在 classpath 根目錄。