jdk9 module机制

本文深入探讨了JDK9引入的模块系统机制,重点介绍了如何通过module-info.java文件控制模块间依赖及包的可见性,确保API的封装性和安全性。通过具体示例,展示了如何在Eclipse中创建模块化项目,并在不同模块间正确导入和使用API。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jdk9之后,引入了module机制。

解决的问题是:A模块只想对外提供api这个package下的公共方法,其它package(比如apiImpl这个package),禁止其它模块引用。

实验:ubuntu18.10,jdk11.0.2,eclipse201812(4.10.0)

创建工程A和工程B,创建时,eclipse提示是否要创建module-info.java文件。

这个文件一般放在src下,参见jdk自身的模块,比如java.logging.

module java.logging {
    exports java.util.logging;
}

使用者在自己的中这样导入A模块

模块A的moudule-info.java
module Api {
  exports mypackage; // mypackage是package名
}

模块B的moudule-info.java
module app {
	requires Api;//这个Api是模块名
}

java中
import mypackage.Api; //mypackage是package名, Api是类名

经过测试,B确实只能访问A模块对外暴漏的包

2023-3-19

module-info.java

module gf_info
{
  requires java.sql;
}


Test1.java

package gaofeng;
/**
 * ~/eclipse-workspace/test1/target$ java -p classes -m gf_info/gaofeng.Test1
 * java --module-path /home/gaofeng/eclipse-workspace/test1/target/classes -m gf_info/gaofeng.Test1
 * 
 */
//

public class Test1 {

	public static void main(String[] args) {
		System.out.println(Test1.class.getResource("/config.json"));
		System.out.println(new java.sql.Timestamp(0) );
	}

}

JDK 21不强制使用模块机制,但模块化在依赖管理、封装性和性能优化上的优势使其成为大型项目的推荐实践。开发者应根据项目需求、团队规模和长期规划决定是否采用模块化。

当遇到一些老库(旧版库或未模块化的库)无法直接适配 Java 模块系统(JPMS)时,可以通过以下方法解决依赖问题,同时兼顾项目的模块化需求:

1. 使用自动模块(Automatic Modules)

未显式模块化的 JAR 包会被 JVM 自动识别为“自动模块”,模块名由文件名(去掉版本号和 .jar 后缀)生成。例如,lib-1.0.jar 会自动转为模块名 lib

  1. 将老库 JAR 放入项目的 module-path(而非 classpath)。
  2. 在项目的 module-info.java 中声明对自动模块的依赖

3. 使用 classpath(非模块化模式)

  • 适用场景
    项目暂不模块化,或依赖大量未模块化的老库。
  • 操作步骤
    1. 将老库 JAR 放入 classpath(而非 module-path)。

java --module-path lib/modules --class-path lib/oldlibs -m my.app/com.example.Main

这些path,都是文件夹,或jar包

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值