问题描述
我和here有类似的问题。然而,这个问题没有提到他使用的是什么构建工具,我假设他使用的是 maven,因为我之前在使用 java 9 模块时没有遇到 maven 问题。
我正在使用 hibernate 验证器并且我想使用 java 9 模块,所以我将一个 module-info
文件添加到我依赖验证器 api 的模块的包中(我使用的类是 { {1}},Validator
,... 来自 ValidatiorFactory
) 之类的包
我搜索了这些类,发现它们位于我的项目依赖项中的这个 jar 中:javax.validation
,我使用的类位于包 validation-api-2.0.1.Final.jar
内。
我在终端中使用了命令 validation
并获得了从该 jar 导出的模块的名称:
jar --file=/path-to-the-jar-on-my-pc/validation-api-2.0.1.Final.jar --describe-module
所以现在当我放入我的 No module descriptor found. Derived automatic module.
java.validation@2.0.1.Final automatic
requires java.base mandated
contains javax.validation
contains javax.validation.bootstrap
contains javax.validation.constraints
contains javax.validation.constraintvalidation
contains javax.validation.executable
contains javax.validation.groups
contains javax.validation.Metadata
contains javax.validation.spi
contains javax.validation.valueextraction
文件例如 module-info
时,IDE 抱怨没有找到模块。我什至在项目结构中手动添加了依赖项(按 requires javax.validation
以在 intellij 中访问它),我从它存储在我的机器中的路径添加它,但结果仍然相同。
我还尝试了 intellij 的帮助工具,我发现它在我的模块信息中添加了 ctrl+shift+alt+s
而不是 requires java.validation;
,但无论如何它们都不起作用。
我在该模块的 requires javax.validation;
中搜索并找到了这个元素 pom.xml
,所以现在我几乎可以肯定是 gradle 导致了问题,但我不是 gradle 和构建工具如何工作的专家,所以我如何继续使用 gradle 作为构建工具来解决这个问题?
解决方法
Gradle 直到 6.4 版才添加对 Java 平台模块系统的适当支持。但是,您必须明确配置 Gradle 才能使用模块。
// build.gradle
java {
modularity.inferModulePath = true
}
不过,如果我没记错的话,从 Gradle 7.0 开始,inferModulePath
默认是 true
。
有关 Java 模块和 Gradle 的更多信息,请参阅 https://docs.gradle.org/current/samples/sample_java_modules_multi_project.html