温馨提示×

温馨提示×

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

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

Java Module 如何依赖

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

Java 9+ 中引入了 Java Platform Module System(JPMS),模块的依赖主要通过 module-info.java 来声明。下面系统地讲一下 Java Module 如何依赖


一、基本概念

1️⃣ 什么是模块(Module)

模块是 一组包 + 一个模块描述文件 module-info.java

src/
 └── main/
     └── java/
         ├── module-info.java
         └── com/example/App.java

二、声明模块依赖(核心)

requires:声明依赖另一个模块

module com.example.app {
    requires com.example.util;
}

含义:

  • com.example.app 依赖 com.example.util
  • 编译期和运行期都必须能访问该模块

三、常见依赖方式

1️⃣ 依赖另一个自定义模块

模块 A

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

模块 B

module com.example.app {
    requires com.example.util;
}

2️⃣ 依赖 JDK 模块(系统模块)

module com.example.app {
    requires java.sql;
    requires java.logging;
}

常见 JDK 模块:

  • java.base(默认自动依赖,无需声明)
  • java.sql
  • java.desktop
  • java.naming

java.base 是所有模块的根模块,自动依赖


3️⃣ 依赖第三方库(未模块化)

如果第三方 JAR 不是模块

方式一:作为 自动模块(Automatic Module)

java --module-path libs --add-modules commons.lang3

模块名规则:

  • 根据 JAR 文件名推断
  • 例如:commons-lang3-3.12.0.jarcommons.lang3
module com.example.app {
    requires commons.lang3;
}

⚠️ 自动模块:

  • 默认导出所有包
  • 可读性无限制
  • 不推荐长期方案

4️⃣ 依赖第三方库(已模块化)

module com.example.app {
    requires com.google.gson;
}

四、导出与可访问性控制

exports:允许其他模块访问

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

exports ... to(限定导出)

module com.example.util {
    exports com.example.internal to com.example.app;
}

com.example.app 可访问


requires transitive(传递依赖)

module com.example.util {
    exports com.example.util;
    requires transitive com.example.common;
}

依赖 com.example.util 的模块 自动依赖 com.example.common


五、服务加载(SPI)

1️⃣ 提供服务(Provider)

module com.example.impl {
    provides com.example.Service
        with com.example.impl.ServiceImpl;
}

2️⃣ 使用服务(Consumer)

module com.example.app {
    uses com.example.Service;
}

代码中使用:

ServiceLoader<Service> loader = ServiceLoader.load(Service.class);

六、打开模块(反射支持)

opens(运行时反射)

module com.example.app {
    opens com.example.model;
}

opens ... to(限定打开)

opens com.example.model to spring.core;

七、模块 vs 非模块依赖(常见误区)

场景 说明
普通 classpath 模块系统不生效
--module-path 模块生效
jar 不在 module-path 当成自动模块
未 exports 编译 / 运行期不可访问

八、典型编译与运行命令

编译

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

运行

java --module-path out -m com.example.app/com.example.app.Main

九、快速总结

核心语法

module 模块名 {
    requires 模块名;
    exports 包名;
}

依赖本质

  • 编译期:能否解析类
  • 运行期:模块可读性与包导出

如果你愿意,我可以:

  • ✅ 给你一个 Maven + Module 示例
  • ✅ 讲 模块 vs 普通 jar 如何选择
  • ✅ 分析 Spring Boot 与 JPMS 的兼容性

你现在是 学习 JPMS 还是 实际项目中使用模块

向AI问一下细节

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

AI