“gradle Jigsaw module not found” 可以翻译为 “gradle Jigsaw 模块未找到”。

huangapple go评论44阅读模式
英文:

gradle Jigsaw module not found

问题

I encountered an issue while trying to run a simple Gradle project that utilizes Java 9 modules. The error I received is as follows:

/home/vadim/IdeaProjects/test_modules/src/main/java/module-info.java:2: error: module not found: HdrHistogram
    requires HdrHistogram;
             ^

Here's the link to the GitHub repository: GitHub Link.

The main class appears to perform minimal tasks:

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);
    }
}

The project relies on the HdrHistogram dependency, and I've included the following command in the build.gradle file, following the official Gradle tutorial:

java {
    modularity.inferModulePath = true
}

The contents of the build.gradle file are as follows:

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'
}

The module-info.java file appears like this:

module test.modules.main {
    requires HdrHistogram;
}

Despite having reviewed multiple Jigsaw tutorials and StackOverflow questions, I'm still struggling to get this simple example to function. How can I resolve this issue? Thank you.

英文:

I try to run a very simple gradle project which uses java 9 modules, but i receive the following error.

/home/vadim/IdeaProjects/test_modules/src/main/java/module-info.java:2: error: module not found: HdrHistogram
    requires HdrHistogram;
             ^

Here is it https://github.com/vad0/test_modules.
The main class does basically nothing.

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);
    }
}

It uses only one dependency: HdrHistogram. I included this magic command in build.gradle according to official gradle tutorial https://docs.gradle.org/current/samples/sample_java_modules_multi_project.html.

java {
    modularity.inferModulePath = true
}

The whole build.gradle looks like this.

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 looks like this

module test.modules.main {
    requires HdrHistogram;
}

I have already read a number of tutorials on Jigsaw and a whole bunch of stackoverflow questions related to it, but still can't make this simple example work. How do i fix it?

Thank you

答案1

得分: 6

抱歉,这段内容的翻译如下:

很不幸,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")
}
英文:

Unfortunately, gradle does not treat every jar as a module (in simple words). If you want to find out how exactly is gradle building the module-path (as opposed to class-path), you probably want to start from 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, but in the very next line: it will not add your dependency to the module-path, because if fails the filter in isModuleJar.

I do not know if this is a bug or not, or may be this is on purpose, but the solution is easy:

plugins.withType(JavaPlugin).configureEach {
    java {
        modularity.inferModulePath = true
    }

    tasks.withType(JavaCompile) {
        doFirst {
            options.compilerArgs = [
                '--module-path', classpath.asPath,
            ]
            classpath = files()
        }
    }
}

you add it to the path, on purpose. I will flag this as a defect and let's see what they have to say.

EDIT

Even better, use a plugin that is written by a gradle commiter:

plugins {
    id 'java'
    id 'de.jjohannes.extra-java-module-info' version "0.1"
}

And the easiest option on your case is to do :

extraJavaModuleInfo {
     automaticModule("HdrHistogram-2.1.12.jar", "HdrHistogram")
}

huangapple
  • 本文由 发表于 2020年8月1日 18:09:59
  • 转载请务必保留本文链接:https://go.coder-hub.com/63204044.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定