Java 9迁移问题-包com.mymodule在未命名的模块中声明,模块'newmodule'不读取它

时间:2018-08-17 04:00:22

标签: migration java-9 java-10 java-module unnamed-module

我创建了一个具有以下结构的多模块项目

    myproject
      |- mymodule
         |- src
            |- main
               |- java
                  |- com
                     |- mymodule
                        |- Util.java

      |-newmodule
         |-src
           |-main
             |-java
               |-com
                 |-newmodule
                    |- Main.java
             |-module-info.java

现在,我想使用Util.java,它是模块化模块newmodule中的非模块化代码。 我已经在newmodule中声明了以下内容

module newmodule {
    requires mymodule;
}

项目编译正常,但是Intellij显示未找到模块,并且包com.mymodule在未命名的模块中声明,模块'newmodule'无法读取它。

如何解决此问题?

还有一个问题,如果我什至不模块化遗留模块,所有旧的非模块化代码默认情况下是否都会在Java 9中默认变成自动模块?

1 个答案:

答案 0 :(得分:3)

解决此问题的一种清晰方法是也将mymodule设为显式模块。我想这就是模块的理想世界。

您也可以在module-info.java中加入mymodule,例如-

module mymodule {
    exports com.mymodule;
}

  

所有旧的非模块化代码默认情况下都变成   如果我甚至不模块化遗留模块,那么Java 9中的自动模块?

未命名模块自动模块的概念是为了帮助迁移并提供与现有类路径技术的兼容性。

一方面,可以在模块路径上 使用模块的依赖关系本身仍然不是模块化的,而您仍然依赖于它们的模块依赖关系。模块系统以将其隐式定义为automatic modules,并桥接JPMS期望的自下而上的迁移。

另一方面,

The unnamed modules依赖于在任何模块中都未定义的类型,并且该类型被确定为仍在类路径上 中找到。这样可以确保每个解析的类型都是某个模块的一部分(如果没有,则为未命名的模块),并且还提供兼容性,使得依赖于类路径的现有应用程序代码也可以在模块系统上进行编译和运行。


文档中明确说明了为什么无法在代码中声明显式依赖的原因:-

  

未命名的模块将导出其所有软件包。这使得灵活   迁移,如下所述。但是,这并不意味着代码   在命名模块中可以访问未命名模块中的类型。 一个命名   实际上,模块甚至不能声明对未命名的依赖   该模块是有意的。因为允许命名模块   依赖于类路径的任意内容   可靠的配置是不可能的。