我创建了一个具有以下结构的多模块项目
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 中的自动模块?
我试图了解JPMS的工作原理.
从这里开始
类路径还没有完全消失.所有JAR(模块化或非模块化)和类路径上的类都将包含在未命名模块中.与自动模块类似,它导出所有包并读取所有其他模块.但显然它没有名字.因此,命名的应用程序模块不能要求和读取它.未命名的模块又可以访问所有其他模块.
请注意...on the classpath will be contained in the Unnamed Module.模块是单数.
从这里开始
为了兼容性,类路径上的所有代码都打包为一个特殊的未命名模块,没有隐藏的包和对整个JDK的完全访问权限.
再次unnamed module.模块是单数.
我是否理解JPMS中始终只有一个未命名的模块?是否意味着在Java9之前开发但未针对Java9更新的应用程序将作为一个未命名的模块加载?
如何创建一个 java 库 jar 来:
module-info)commons-exec)?依赖项是一个实现细节 - 不应导出。
具有以下条件build.gradle(使用gradle-6.8):
plugins {
id 'java-library'
}
group = 'test'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '15'
repositories {
mavenCentral()
}
java {
modularity.inferModulePath = true
}
dependencies {
implementation 'org.apache.commons:commons-exec:1.3'
}
Run Code Online (Sandbox Code Playgroud)
以及以下内容module-info.java:
module test.module {
requires commons.exec;
}
Run Code Online (Sandbox Code Playgroud)
我收到以下编译错误:
module-info.java:2: error: module not found: commons.exec
requires commons.exec;
^
Run Code Online (Sandbox Code Playgroud)
如果我不包含,requires commons.exec则错误将变为:
error: package org.apache.commons.exec is not visible …Run Code Online (Sandbox Code Playgroud) java gradle java-platform-module-system java-9 unnamed-module