# JDK11+模塊化項目打包的實現方法
## 引言
隨著Java 9引入模塊化系統(JPMS, Java Platform Module System),Java開發者獲得了更強大的代碼組織和依賴管理能力。JDK11作為長期支持版本(LTS),其模塊化特性在企業級開發中得到了廣泛應用。本文將深入探討在JDK11及以上版本中,模塊化項目的打包實現方法,涵蓋從基礎概念到高級實踐的完整流程。
---
## 一、Java模塊化基礎
### 1.1 模塊化核心概念
- **模塊(Module)**:具有明確邊界的代碼單元,包含:
- `module-info.java` 聲明文件
- 包(packages)
- 資源文件
- **模塊描述符**:
```java
module com.example.myapp {
requires java.base; // 顯式聲明依賴
exports com.example.api; // 導出公共API
}
特性 | 傳統JAR | 模塊化JAR |
---|---|---|
依賴管理 | 類路徑(Classpath) | 模塊路徑(Modulepath) |
可見性控制 | public即可訪問 | 需要顯式exports |
啟動方式 | java -jar | java -p -m |
my-module-project/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ ├── com.example.app/
│ │ │ │ └── Main.java
│ │ │ └── module-info.java
│ │ └── resources/
│ └── test/
│ └── java/
├── lib/ # 第三方依賴
└── target/ # 輸出目錄
multi-module/
├── core-module/
│ └── src/
├── web-module/
│ └── src/
└── app-module/ # 聚合模塊
└── src/
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
</plugins>
</build>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifestEntries>
<Multi-Release>true</Multi-Release>
</manifestEntries>
</archive>
</configuration>
</plugin>
plugins {
id 'java'
id 'application'
}
java {
modularity.inferModulePath = true
}
application {
mainModule = 'com.example.app'
mainClass = 'com.example.app.Main'
}
tasks.compileJava {
options.compilerArgs += [
'--module-path', classpath.asPath
]
classpath = files()
}
jlink --module-path $JAVA_HOME/jmods:target/modules \
--add-modules com.example.app \
--launcher APP=com.example.app/com.example.app.Main \
--output custom-runtime
META-INF/
└── versions/
└── 11/
└── com/example/Utils.class
module provider {
provides com.example.spi.Service
with com.example.impl.ServiceImpl;
}
現象:Module not found
錯誤
解決方案:
1. 檢查--module-path
參數
2. 驗證依賴模塊是否已正確導出包
opens com.example.internal to spring.core;
--add-opens=java.base/java.lang=ALL-UNNAMED
requires static
表示可選依賴Multi-Release JAR
支持多JDK版本# 編譯
javac -d target/classes src/main/java/module-info.java src/main/java/com/example/**/*.java
# 打包
jar --create \
--file target/myapp.jar \
--main-class com.example.app.Main \
-C target/classes .
# 創建聚合器JAR
jar --create \
--file target/all-modules.jar \
--main-class com.example.app.Main \
-C module1/target/classes . \
-C module2/target/classes .
JDK11+的模塊化系統為Java應用帶來了革命性的改進。通過合理使用模塊化打包技術,開發者可以構建更安全、更高效的應用程序。隨著工具鏈的不斷完善,模塊化將成為Java生態的主流發展方向。
延伸閱讀: - Oracle官方模塊化指南 -《Java模塊化開發實踐》(O’Reilly) “`
注:本文實際約4500字(含代碼示例),完整執行需要配合具體開發環境。建議通過實際項目練習來鞏固模塊化打包技能。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。