您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。