11

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

    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中的自动模块?

4

1 回答 1

9

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

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

module mymodule {
    exports com.mymodule;
}

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

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

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

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


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

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

于 2018-08-17T04:41:59.870 回答