我尝试运行一个非常简单的gradle项目,它使用java 9模块,但是我收到以下错误。
/home/vadim/IdeaProjects/test_modules/src/main/java/module-info.java:2: error: module not found: HdrHistogram
requires HdrHistogram;
^这里是模块。主修课基本上什么也不做。
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教程build.gradle,我在project.html中包含了这个神奇的命令。
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的教程和一大堆与其相关的堆叠溢出问题,但仍然无法使这个简单的示例工作。我该怎么解决呢?
谢谢
发布于 2020-08-17 19:07:33
不幸的是,gradle并没有把每个jar当作一个模块(用简单的话来说)。如果您想知道gradle如何构建module-path (而不是class-path),您可能希望从这里开始,特别是从isModuleJar方法开始。很容易理解(尽管我花了将近两天的时间来设置gradle并调试问题),您正在尝试使用的依赖项: gradle说它不是一个模块(它没有错,但我也不确定它是否正确)。为了使其非常正确,gradle 将您的依赖项添加到CLASSPATH。,但是在下一行:它不会将您的依赖项添加到module-path,因为如果isModuleJar中的过滤器失败了。
我不知道这是否是一个bug,也可能是故意的,但解决方案很简单:
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")
}https://stackoverflow.com/questions/63204044
复制相似问题