我开始研究模块,我想尝试“需要传递”。所以我为界面创建了一个模块:
module interfacesModule {
exports com.my.interfaces;
}
Run Code Online (Sandbox Code Playgroud)
有 1 个接口:
package com.my.interfaces;
public interface MyInterface {
void go();
}
Run Code Online (Sandbox Code Playgroud)
一个实现模块:
module javaModuleA {
requires interfacesModule;
exports com.my.moduleA;
}
Run Code Online (Sandbox Code Playgroud)
班级:
package com.my.moduleA;
import com.my.interfaces.MyInterface;
public class ClassA implements MyInterface {
public void go() {
System.out.println("in class A");
}
}
Run Code Online (Sandbox Code Playgroud)
和主模块:
module mainModule {
requires transitive javaModuleA;
requires interfacesModule; // this line I want to comment, to use from requires transitive
}
Run Code Online (Sandbox Code Playgroud)
班级:
package com.my;
import com.my.interfaces.MyInterface;
import com.my.moduleA.ClassA;
public class Main {
public static void main(String[] args) {
System.out.println("main java module");
MyInterface a = new ClassA();
a.go();
}
}
Run Code Online (Sandbox Code Playgroud)
这很好用!
现在,如果我评论“需要接口模块;”这一行 在我的主模块上,它是否仍然可以工作,因为我有 javaModuleA 的“需要传递”?
当我评论它时,我得到“com.my.interfaces.MyInterface 类型不可访问”。
requires transitive javaModuleA;其中的声明意味着mainModule具有requires mainModule声明的假设模块将自动获得依赖项,就像也具有声明requires javaModuleA;一样。
换句话说,你想要做的事情,为了获得隐含的requires interfacesModule;,mainModule需要改变javaModuleA
module javaModuleA {
requires transitive interfacesModule;
exports com.my.moduleA;
}
Run Code Online (Sandbox Code Playgroud)
然后,mainModule拥有requires javaModuleA;或requires transitive javaModuleA;就可以使用 的导出包,interfacesModule而不需要requires interfacesModule;.
基本原理是,您可能有一个javaModuleA包含接口和实现的模块作为起点,并决定将已经变得太大的模块重构为javaModuleA和interfacesModule,而不需要调整依赖模块。然后,拥有requires transitive interfacesModule;injavaModuleA允许依赖的模块javaModuleA继续工作,就好像它仍然是大模块一样。
| 归档时间: |
|
| 查看次数: |
442 次 |
| 最近记录: |