gradle 未找到拼图模块
gradle Jigsaw module not found
我尝试 运行 一个使用 java 9 个模块的非常简单的 gradle 项目,但我收到以下错误。
/home/vadim/IdeaProjects/test_modules/src/main/java/module-info.java:2: error: module not found: HdrHistogram
requires HdrHistogram;
^
就在这里https://github.com/vad0/test_modules。
主要的 class 基本上什么都不做。
package app;
import org.HdrHistogram.Histogram;
public class RunHdr {
public static void main(String[] args) {
final Histogram histogram = new Histogram(5);
System.out.println(histogram);
}
}
它只使用一个依赖项:HdrHistogram。我根据官方 gradle 教程 https://docs.gradle.org/current/samples/sample_java_modules_multi_project.html.
在 build.gradle 中包含了这个魔法命令
java {
modularity.inferModulePath = true
}
整个build.gradle是这样的
plugins {
id 'java'
}
group 'org.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
java {
modularity.inferModulePath = true
}
dependencies {
compile group: 'org.hdrhistogram', name: 'HdrHistogram', version: '2.1.12'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
module.info 看起来像这样
module test.modules.main {
requires HdrHistogram;
}
我已经阅读了许多关于 Jigsaw 的教程以及一大堆与之相关的 Whosebug 问题,但仍然无法使这个简单的示例起作用。我该如何解决?
谢谢
不幸的是,gradle
并没有将每个 jar 都视为一个模块(简单来说)。如果您想了解 究竟 是如何 gradle
构建 module-path
(相对于 class-path
),您可能想从 here, specifically at the isModuleJar method. It's pretty easy to understand (though it took me almost two days to set-up gradle and debug the problem out) that the dependency that you are trying to use : gradle says that it is not a module (it isn't wrong, but I am not sure it is correct either). To make it very correct, gradle
will add your dependency to the CLASSPATH,但在下一行:它将 不 将您的依赖项添加到 module-path
,因为如果 isModuleJar
.[=21 中的过滤器失败=]
我不知道这是不是一个错误,或者这是故意的,但解决方案很简单:
plugins.withType(JavaPlugin).configureEach {
java {
modularity.inferModulePath = true
}
tasks.withType(JavaCompile) {
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
]
classpath = files()
}
}
你故意将它添加到路径中。我会将此标记为缺陷,让我们看看他们怎么说。
编辑
更好的是,使用 gradle 提交者编写的插件:
plugins {
id 'java'
id 'de.jjohannes.extra-java-module-info' version "0.1"
}
针对您的情况,最简单的选择是:
extraJavaModuleInfo {
automaticModule("HdrHistogram-2.1.12.jar", "HdrHistogram")
}
我尝试 运行 一个使用 java 9 个模块的非常简单的 gradle 项目,但我收到以下错误。
/home/vadim/IdeaProjects/test_modules/src/main/java/module-info.java:2: error: module not found: HdrHistogram
requires HdrHistogram;
^
就在这里https://github.com/vad0/test_modules。 主要的 class 基本上什么都不做。
package app;
import org.HdrHistogram.Histogram;
public class RunHdr {
public static void main(String[] args) {
final Histogram histogram = new Histogram(5);
System.out.println(histogram);
}
}
它只使用一个依赖项:HdrHistogram。我根据官方 gradle 教程 https://docs.gradle.org/current/samples/sample_java_modules_multi_project.html.
在 build.gradle 中包含了这个魔法命令java {
modularity.inferModulePath = true
}
整个build.gradle是这样的
plugins {
id 'java'
}
group 'org.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
java {
modularity.inferModulePath = true
}
dependencies {
compile group: 'org.hdrhistogram', name: 'HdrHistogram', version: '2.1.12'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
module.info 看起来像这样
module test.modules.main {
requires HdrHistogram;
}
我已经阅读了许多关于 Jigsaw 的教程以及一大堆与之相关的 Whosebug 问题,但仍然无法使这个简单的示例起作用。我该如何解决?
谢谢
不幸的是,gradle
并没有将每个 jar 都视为一个模块(简单来说)。如果您想了解 究竟 是如何 gradle
构建 module-path
(相对于 class-path
),您可能想从 here, specifically at the isModuleJar method. It's pretty easy to understand (though it took me almost two days to set-up gradle and debug the problem out) that the dependency that you are trying to use : gradle says that it is not a module (it isn't wrong, but I am not sure it is correct either). To make it very correct, gradle
will add your dependency to the CLASSPATH,但在下一行:它将 不 将您的依赖项添加到 module-path
,因为如果 isModuleJar
.[=21 中的过滤器失败=]
我不知道这是不是一个错误,或者这是故意的,但解决方案很简单:
plugins.withType(JavaPlugin).configureEach {
java {
modularity.inferModulePath = true
}
tasks.withType(JavaCompile) {
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
]
classpath = files()
}
}
你故意将它添加到路径中。我会将此标记为缺陷,让我们看看他们怎么说。
编辑
更好的是,使用 gradle 提交者编写的插件:
plugins {
id 'java'
id 'de.jjohannes.extra-java-module-info' version "0.1"
}
针对您的情况,最简单的选择是:
extraJavaModuleInfo {
automaticModule("HdrHistogram-2.1.12.jar", "HdrHistogram")
}