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
。
- 将老库 JAR 放入项目的
module-path
(而非classpath
)。 - 在项目的
module-info.java
中声明对自动模块的依赖
3. 使用 classpath
(非模块化模式)
- 适用场景:
项目暂不模块化,或依赖大量未模块化的老库。 - 操作步骤:
- 将老库 JAR 放入
classpath
(而非module-path
)。
- 将老库 JAR 放入
java --module-path lib/modules --class-path lib/oldlibs -m my.app/com.example.Main
这些path,都是文件夹,或jar包