温馨提示×

温馨提示×

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

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

Java Module 如何导出

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

Java 9+ 中,Module(模块)通过 module-info.java 来声明“导出(export)哪些包”。这是 JPMS(Java Platform Module System)的核心。

下面按 原理 → 语法 → 示例 → 常见场景 说明。


一、模块如何“导出”

1️⃣ 基本规则

  • 只有被 exports 的包,才能被其他模块访问
  • 未导出的包:
    • 模块内部可用
    • 外部模块 无法访问(编译期 + 运行期都不可用)

二、module-info.java 基本语法

module com.example.myapp {
    exports com.example.api;
}

表示:

  • 模块名:com.example.myapp
  • 导出的包:com.example.api
  • 其他模块可以:
    • import com.example.api.*
    • 使用其中的 public / public final

三、完整示例

1️⃣ 项目结构

myapp/
├── src/
│   └── main/
│       └── java/
│           ├── module-info.java
│           └── com/example/api/
│               └── HelloService.java
│           └── com/example/internal/
│               └── InternalUtil.java

2️⃣ module-info.java

module com.example.myapp {
    exports com.example.api;
}

3️⃣ 导出的包(API)

package com.example.api;

public class HelloService {
    public String sayHello() {
        return "Hello";
    }
}

✅ 其他模块可以访问


4️⃣ 未导出的包(内部实现)

package com.example.internal;

public class InternalUtil {
    public static void help() {
        System.out.println("inside");
    }
}

❌ 其他模块 无法访问


四、其他模块如何使用

模块 B

module com.example.client {
    requires com.example.myapp;
}
import com.example.api.HelloService;

public class Main {
    public static void main(String[] args) {
        HelloService service = new HelloService();
        System.out.println(service.sayHello());
    }
}

五、常见导出方式汇总

✅ 基本导出

exports com.example.api;

✅ 限定导出(只允许指定模块访问)

exports com.example.spi to com.example.plugin;

⚠️ 即使限定导出:

  • 包仍然是 强封装
  • 其他模块无法 requires 使用

✅ 导出 + 反射(非常重要)

如果你使用:

  • Spring
  • Hibernate
  • Jackson
  • MyBatis
  • 反射 / 序列化

需要:

opens com.example.api;

或:

opens com.example.api to spring.core, jackson.databind;

✅ 导出 vs open 对比

方式 是否可访问 public 类 是否允许反射
exports
opens
未导出

六、导出整个模块(不推荐)

不能导出整个模块

exports com.example.myapp; // 错误

✅ 只能导出


七、常见错误

❌ 错误 1:访问未导出的包

package com.example.internal is not exported

✅ 解决:

  • 导出该包
  • 或确认是否应为内部实现

❌ 错误 2:反射失败

InaccessibleObjectException

✅ 解决:

opens com.example.api;

八、总结一句话

Java Module 通过 module-info.java 中的 exports 控制外部可见性,只有导出的包才能被其他模块访问。

如果你愿意,我可以:

  • 帮你写一个 完整可运行的模块化项目
  • 对比 Maven + Module
  • 解释 为什么 Spring 需要 opens
向AI问一下细节

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

AI