如何依赖 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(我正在使用的 类 是 Validator
、ValidatiorFactory
,...来自 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 写的矛盾,但如果你使用插件,这是必要的。请参阅文档
我有与
我正在使用hibernate验证器,我想使用java9个模块,所以我在依赖验证器的模块的包中添加了一个module-info
文件api(我正在使用的 类 是 Validator
、ValidatiorFactory
,...来自 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 写的矛盾,但如果你使用插件,这是必要的。请参阅文档