Модуль Gradle Jigsaw не найден - PullRequest
       92

Модуль Gradle Jigsaw не найден

1 голос
/ 01 августа 2020

Я пытаюсь запустить очень простой проект Gradle, который использует java 9 модулей, но получаю следующую ошибку:

/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. Я включил эту команду magi c в build.gradle в соответствии с официальным руководством по gradle https://docs.gradle.org/current/samples/sample_java_modules_multi_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 и целую кучу вопросов, связанных с stackoverflow, но все еще не могу заставить этот простой пример работать . Как исправить?

Спасибо

1 Ответ

1 голос
/ 17 августа 2020

К сожалению, gradle не рассматривает каждую банку как модуль (простыми словами). Если вы хотите узнать, как точно соответствует gradle, строящему module-path (в отличие от class-path), вы, вероятно, захотите начать с здесь , особенно с isModuleJar метод. Довольно легко понять (хотя мне потребовалось почти два дня, чтобы настроить gradle и отладить проблему), что зависимость, которую вы пытаетесь использовать: gradle, говорит, что это не модуль (это не так, но Я тоже не уверен, что это правильно). Чтобы сделать его очень правильным, gradle добавит вашу зависимость к CLASSPATH , но уже в следующей строке: не добавит вашу зависимость к module-path, потому что если не работает фильтр в isModuleJar.

Я не знаю, ошибка это или нет, или может быть это специально, но решение простое:

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

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

вы специально добавьте его в путь. Я отмечу это как дефект и посмотрим, что они скажут.

EDIT

Еще лучше, используйте плагин, написанный коммитером gradle:

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

А самый простой вариант в вашем случае это сделать:

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