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

Java 9 migration issue - package com.mymodule is declared in unnamed module , module 'newmodule' does not read it

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

    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 中是否默认变成自动模块?

解决这个问题的一个明确方法是将 mymodule 也作为一个显式模块。这就是我想说的模块的理想世界。

您也可以通过在 mymodule 中包含一个 module-info.java 来做到这一点,比如 -

module mymodule {
    exports com.mymodule;
}

does all the old non modular code is by default turn into automatic-module in java 9 if i don't even modularized legacy modules?

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

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

另一方面,

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


文档中清楚地说明了您无法在代码中声明显式依赖的原因:-

The unnamed module exports all of its packages. This enables flexible migration, as we shall see below. It does not, however, mean that code in a named module can access types in the unnamed module. A named module cannot, in fact, even declare a dependence upon the unnamed module. This restriction is intentional, since allowing named modules to depend upon the arbitrary content of the class path would make reliable configuration impossible.