对于不能在 Eclipse 上运行的模块,“需要传递”?

Tom*_*ito 1 java java-module

我开始研究模块,我想尝试“需要传递”。所以我为界面创建了一个模块:

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 类型不可访问”。

Hol*_*ger 5

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包含接口和实现的模块作为起点,并决定将已经变得太大的模块重构为javaModuleAinterfacesModule,而不需要调整依赖模块。然后,拥有requires transitive interfacesModule;injavaModuleA允许依赖的模块javaModuleA继续工作,就好像它仍然是大模块一样。