如何依赖 java 验证 api / java 中的休眠模块和 gradle 作为构建工具?

How to depend on java validation api /hibernate modules in java with gradle as build tool?

我有与 类似的问题。然而,这个问题没有提到他正在使用什么构建工具,我假设他正在使用 maven,因为我以前使用 java 9 个模块时没有遇到 maven 问题。

我正在使用hibernate验证器,我想使用java9个模块,所以我在依赖验证器的模块的包中添加了一个module-info文件api(我正在使用的 类 是 ValidatorValidatiorFactory ,...来自 javax.validation 等包)

我搜索了这些 类,发现它们位于我的项目依赖项中的这个 jar 中:validation-api-2.0.1.Final.jar,我正在使用的 类 位于包 validation 中.

我在终端中使用命令 jar --file=/path-to-the-jar-on-my-pc/validation-api-2.0.1.Final.jar --describe-module 并获得了从那个 jar 导出的模块的名称:

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 文件时,例如 requires javax.validation IDE 抱怨找不到模块。我什至在项目结构中手动添加了依赖项(按 ctrl+shift+alt+s 在 intellij 中访问它),我从它存储在我机器中的路径添加了它,但结果仍然相同。

我也尝试了 intellij 的帮助工具,我发现它在我的模块信息中添加了 requires java.validation; 而不是 requires javax.validation;,但无论如何它们都不起作用。

我在那个模块的 pom.xml 中搜索并找到了这个元素 <Automatic-Module-Name>java.validation</Automatic-Module-Name>,所以现在我几乎可以肯定 gradle 导致了问题,但我不是 [=] 方面的专家46=] 以及构建工具的工作原理,那么我如何通过继续使用 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

我遇到了同样的问题。将 javax.validation 更改为 jakarta.validation 解决了它。

build.gradle.kts:

implementation("jakarta.validation:jakarta.validation-api:3.0.1")

模块-info.java:

requires jakarta.validation;

我正在使用 gradle java 模块化插件

https://plugins.gradle.org/plugin/org.javamodularity.moduleplugin

这是我在 build.gradle.kts 上设置的:

java {
    modularity.inferModulePath.set(false)
}

application {
    // Define the main class for the application.
    mainModule.set("modules.demo.gradle.consumer")
    mainClass.set("com.demo.gradle.consumer.Consumer")
}

我知道 modularity.inferModulePath.set(false) 与 Slaw 写的矛盾,但如果你使用插件,这是必要的。请参阅文档

https://github.com/java9-modularity/gradle-modules-plugin