温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java Module 怎么使用

发布时间:2026-08-31 13:09:39 来源:亿速云 阅读:90 作者:小樊 栏目:编程语言

下面从概念 → 创建 → 使用 → 常见问题给你一个实用向的 Java Module(Java 9+ 引入的 JPMS:Java Platform Module System)入门说明。


一、什么是 Java Module?

Java Module 是 Java 9 引入的代码组织方式,用来代替传统的“包 + JAR”松散结构。

✅ 核心目标:

  • 强封装(你不让我访问,我就访问不了)
  • 显式依赖(用哪个模块必须声明)
  • 可维护、可演进的大型项目

二、Module 基本结构

1️⃣ 目录结构示例

project
│
├── module-a
│   ├── src/main/java
│   │   ├── module-info.java
│   │   └── com/example/a/Hello.java
│
├── module-b
│   ├── src/main/java
│   │   ├── module-info.java
│   │   └── com/example/b/App.java

三、module-info.java 是什么?

每个模块必须有一个 module-info.java

示例 1:定义一个模块

module module.a {
    exports com.example.a;
}

✅ 含义:

  • 模块名:module.a
  • 对外暴露包:com.example.a

示例 2:使用其他模块

module module.b {
    requires module.a;
}

✅ 含义:

  • module.b 依赖 module.a
  • 只能访问 module.aexports 的包

四、完整示例(从零开始)

1️⃣ 定义模块 A

// module-a/src/main/java/module-info.java
module module.a {
    exports com.example.a;
}
// module-a/src/main/java/com/example/a/Hello.java
package com.example.a;

public class Hello {
    public String say() {
        return "Hello Module";
    }
}

2️⃣ 定义模块 B

// module-b/src/main/java/module-info.java
module module.b {
    requires module.a;
}
// module-b/src/main/java/com/example/b/App.java
package com.example.b;

import com.example.a.Hello;

public class App {
    public static void main(String[] args) {
        Hello hello = new Hello();
        System.out.println(hello.say());
    }
}

五、编译 & 运行(命令行)

1️⃣ 编译模块 A

javac \
  --module-source-path module-a/src/main/java \
  -d out \
  $(find module-a -name "*.java")

2️⃣ 编译模块 B

javac \
  --module-path out \
  --module-source-path module-b/src/main/java \
  -d out \
  $(find module-b -name "*.java")

3️⃣ 运行

java --module-path out -m module.b/com.example.b.App

六、常用 Module 指令速查

指令 作用
module xxx {} 定义模块
exports pkg 导出包
requires module 依赖模块
requires transitive module 传递依赖
opens pkg 允许反射访问
provides ... with ... SPI
uses ... 使用 SPI

七、常见坑 & 问题

❌ 1. 访问限制

package com.example.a.internal;

如果没 exports,即使有 requires 也无法访问。

✅ 解决:

exports com.example.a.internal;

❌ 2. 反射失败(框架常见)

Spring / Hibernate 需要反射。

✅ 解决:

opens com.example.a to spring.core;

或(不推荐,完全开放):

open module module.a {
    exports com.example.a;
}

❌ 3. 老 JAR 不是模块

✅ 解决方式:

  • 自动模块(放到 module-path)
  • 或继续使用 classpath(不强制模块化)

八、Maven / Gradle 支持吗?

支持,但大多数项目目前:

  • 源码模块化
  • 构建仍用 classpath

例如 Maven:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.11.0</version>
  <configuration>
    <release>17</release>
  </configuration>
</plugin>

九、什么时候该用 Module?

✅ 适合:

  • JDK / 框架级项目
  • 大型系统、插件化架构
  • 强封装需求

❌ 不太适合:

  • 普通业务小项目
  • 大量反射的老项目

十、一句话总结

Java Module = 更强的包访问控制 + 显式依赖声明

如果你愿意,我可以:

  • ✅ 用 Spring Boot 示例说明
  • ✅ 对比 Module vs 普通 Jar
  • ✅ 讲 自动模块 / 未命名模块
  • ✅ 帮你把现有项目改成模块化

你现在用的是 Java 几?Maven 还是 Gradle?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI