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

lea*_*ner 9 java migration java-9 java-module unnamed-module

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

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

      |-newmodule
         |-src
           |-main
             |-java
               |-com
                 |-newmodule
                    |- Main.java
             |-module-info.java
Run Code Online (Sandbox Code Playgroud)

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

module newmodule {
    requires mymodule;
}
Run Code Online (Sandbox Code Playgroud)

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

如何解决这个问题?

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

Nam*_*man 8

解决此问题的一种明确方法是将 也mymodule设为显式模块。我会说这只是模块的理想世界。

你也可以通过包含一个module-info.javain来做到这mymodule一点,比如 -

module mymodule {
    exports com.mymodule;
}
Run Code Online (Sandbox Code Playgroud)

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

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

一方面,您的模块的依赖项本身仍然不是模块化的并且您仍然依赖它们是一个,可以在模块系统的模块路径上使用以隐式定义它们,当被视为自动模块并桥接底部时JPMS 预期的向上迁移。

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


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

未命名模块导出其所有包。这使得灵活的迁移成为可能,我们将在下面看到。然而,这并不意味着命名模块中的代码可以访问未命名模块中的类型。事实上,命名模块甚至不能声明对未命名模块的依赖。这个限制是有意的,因为允许命名模块依赖于类路径的任意内容会使可靠的配置变得不可能。