【发布时间】:2020-09-05 08:11:49
【问题描述】:
最近我发现,如果模块内的包包含公共接口或类,它们会自动导出,因此在接收者代码未模块化时无意中在模块外部可见。
项目结构如下
parent
sub-donor (java-module)
my/project/first
Cowboy.java
module-info.java
sub-recipient (has no module-info)
my/project/somewhere
Main.java
模块信息.java
module my.donor {
// nothing is exported here
}
Cowboy.java
public class Cowboy {
public String say() { return "eee-ha"; }
}
Main.java
import my.project.first.Cowboy;
public class Main {
public static void main(String[] args) {
Cowboy g = new Cowboy();
System.out.println(g.say());
}
}
my.project.first 包中的类应该只在my.donor 模块中使用,并且在模块外是不可见的。
没想到在模块外可见,好像有exports my.project.first;行,所以类Main可以编译。
限制可见性的方法是使sub-recipient成为一个java模块,添加module-info.java,然后sub-donor内部的所有内容都按预期隐藏。当然,对于任何其他非模块化项目,my.donor 模块中的每个公共类仍然可见。
请在 GitHub 上查看最小的working example。
我很好奇这是一个错误还是有意识的设计。 这种方法的目的是什么?
【问题讨论】:
-
“出乎意料地它们是可见的” 你是如何确定这一点的?好奇你的
module.info中是否有opens指令,并在运行时得出这个结论。 -
@Michael, @Naman 我已经更新了这个问题。当接收模块没有
module-info.java文件时,可以重现该问题。附上github上的一个例子。 -
请您编辑您的问题以包含您运行的产生您报告的行为的 full 命令吗? TIA。
-
@deduper 完整命令只是父项目上的
mvn compile。问题是编译时sub-recipient中sub-donor模块的内部包的可见性。
标签: java interface visibility java-module module-info