"requires transitive" 对于不能在 Eclipse 上运行的模块?

"requires transitive" for modules not working on Eclipse?

开始研究模块,想试试“requires transitive”。所以我为界面创建了一个模块:

module interfacesModule {
    
    exports com.my.interfaces;
    
}

有 1 个接口:

package com.my.interfaces;

public interface MyInterface {

    void go();

}

实现模块:

module javaModuleA {
    
    requires interfacesModule;
    
    exports com.my.moduleA;
    
}

class:

package com.my.moduleA;

import com.my.interfaces.MyInterface;

public class ClassA implements MyInterface {
    
    public void go() {
        System.out.println("in class A");
    }

}

和主模块:

module mainModule {
    
    requires transitive javaModuleA;
    requires interfacesModule; // this line I want to comment, to use from requires transitive

}

class:

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();
    }

}

这很好用!

现在,如果我注释行“requires interfacesModule;”在我的主模块上,它是否仍然可以工作,因为我有 javaModuleA 的“需要传递”?

当我评论它时,我得到“类型 com.my.interfaces.MyInterface 不可访问”。

mainModule 中的 requires transitive javaModuleA; 声明意味着具有 requires mainModule 声明的假设模块将自动获得依赖项,就好像也具有声明 requires javaModuleA; 一样。

换句话说,您要尝试为 mainModule 获取隐式 requires interfacesModule;,需要更改 javaModuleA

module javaModuleA {
    requires transitive interfacesModule;
    exports com.my.moduleA;
}

然后,具有 requires javaModuleA;requires transitive javaModuleA;mainModule 可以使用 interfacesModule 的导出包而不需要 requires interfacesModule;.

理由是您可能有一个包含接口和实现的 javaModuleA 作为起点,并决定将已经变得太大的模块重构为 javaModuleAinterfacesModule,无需适配依赖模块。然后,在 javaModuleA 中包含 requires transitive interfacesModule; 允许依赖于 javaModuleA 的模块继续工作,就好像它仍然是大模块一样。