java - 未找到 gradle Jigsaw 模块

标签 java gradle java-9 java-platform-module-system 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 .
主类基本上什么都不做。
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 的教程和一大堆与之相关的 stackoverflow 问题,但仍然无法使这个简单的示例工作。我如何解决它?
谢谢

最佳答案

不幸的是,gradle不会将每个 jar 都视为一个模块(简单来说)。如果你想知道 gradle 到底是怎么回事 build module-path (相对于 class-path ),您可能希望从 here 开始,特别是在 isModuleJar方法。您尝试使用的依赖项很容易理解(尽管我花了将近两天的时间来设置 gradle 并调试问题): gradle 说它不是一个模块(它没有错,但是我也不确定它是否正确)。为了使它非常正确,gradle will add your dependency to the CLASSPATH ,但在下一行:它不会将您的依赖项添加到 module-path , 因为如果 isModuleJar 中的过滤器失败.
我不知道这是否是错误,或者可能是故意的,但解决方案很简单:

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 - 未找到 gradle Jigsaw 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63204044/

相关文章:

java - 寻找 4 个元素的共同元素

java - 如何检查 Java 类是否包含 JUnit4 测试?

android-studio - Kotlin Multiplatform Mobile:条目名称 'META-INF/androidx.vectordrawable_vectordrawable.version'发生冲突

android - 无法解析 : com. android.support :appcompat-v7:28. 0

java - 资源文件在构建Java 9模块的Gradle项目中位于何处?

java - 应用程序类 'java.lang.String.substring:1339' Websphere Liberty 引发的异常

java - 如何显示星号的数量到最接近的千位?

gradle - 如何通过groovy将文件复制到目录(如果不存在)(如果存在则不复制)

java - 使用 JDK9 的 Eclipse Indigo

java - 是否可以使用 Jigsaw 在 Java 9 中通过反射访问包范围的方法?