首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使其他非模块化项目的Java类在其模块之外不可见?

如何使其他非模块化项目的Java类在其模块之外不可见?
EN

Stack Overflow用户
提问于 2020-05-19 09:49:12
回答 1查看 607关注 0票数 3

最近,我发现,如果模块中的包包含公共接口或类,它们将自动导出,因此在模块之外无意中可见,以防收件人代码没有模块化。

该项目的结构如下

代码语言:javascript
复制
parent

   sub-donor                      (java-module)
       my/project/first
           Cowboy.java
       module-info.java

   sub-recipient                  (has no module-info)
       my/project/somewhere
           Main.java 

module-info.java

代码语言:javascript
复制
module my.donor {
  // nothing is exported here
}

Cowboy.java

代码语言:javascript
复制
public class Cowboy {    
  public String say() { return "eee-ha"; }
}

Main.java

代码语言:javascript
复制
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。

我很好奇这是一个错误还是一个有意识的设计。这种方法的目的是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-07 19:23:18

TL;- Maven's yer问题。使用javac直接编译就像预期的那样。

长线版

“…完整命令就是父项目…上的mvn编译。“

这就是你的问题所在。Maven有一个令人惊讶的特性,它只将子项目视为JPMS模块IFF所有子项目的都有模块描述符。

因此,因为只有您的sub-donor Maven模块具有JPMS模块描述符,所以您的两个子项目都将在类路径…上编译。

代码语言:javascript
复制
$ mvn -e -X compile
…
[INFO] Changes detected - recompiling the module!
[DEBUG] Classpath:
[DEBUG]  sample-so-question-61888059-dev/sub-recipient/target/classes
[DEBUG]  sample-so-question-61888059-dev/sub-donor/target/classes
…
[DEBUG] Command line options:
[DEBUG] -d sample-so-question-61888059-dev/sub-recipient/target/classes -classpath sample-so-question-61888059-dev/sub-recipient/target/classes;sample-so-question-61888059-dev/sub-donor/target/classes;…
…

而且因为两者都在类路径上,所以sub-donor子项目的模块描述符被呈现为无效。

但是,如果您将事情掌握在自己的手中,并直接运行javac (假设您预先编译了sub-donor项目),…

代码语言:javascript
复制
javac --add-modules my.donor --module-path sample-so-question-61888059-dev/sub-donor/target/classes --class-path sample-so-question-61888059-dev/sub-recipient/target/classes -d sample-so-question-61888059-dev/sub-recipient/target/classes sample-so-question-61888059-dev/sub-recipient/src/main/java/my/somewhere/*.java

那么javac确实会因为有意识地设计…而退缩

代码语言:javascript
复制
sample-so-question-61888059-dev/sub-recipient/src/main/java/my/somewhere/Main.java:3: error: package my.project.first is not visible
import my.project.first.Cowboy;
                 ^
  (package my.project.first is declared in module my.donor, which does not export it)
1 error
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61888059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档