【问题标题】:gradle Jigsaw module not found未找到 gradle Jigsaw 模块
【发布时间】:2020-08-01 10:09:59
【问题描述】:

我尝试运行一个非常简单的使用 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 问题,但仍然无法使这个简单的示例工作。我该如何解决?

谢谢

【问题讨论】:

  • 奇怪!我使用maven,并且能够使用相同的工件版本添加模块HdrHistogram
  • 不幸的是,从 gradle 切换到 maven 对我来说不是一个选择
  • @Naman 你知道maven 做了什么来使它成为一个自动模块吗?
  • @Eugene 在不深入实际代码的情况下,从build logs Maven 似乎正在做的是首先识别编译路径上的所有依赖项。然后基于本身是模块化的工件/罐子,即包括 模块描述符,或在 META-INF 中声明 Automatic-Module-Name,或任何其他作为一部分的工件maven 模块本身的module-info.java 被视为在模块路径而不是类路径上。共享的日志有两个组成部分可以明确区分。
  • @Naman here 是 gradle 如何通过 gradle 核心作者的插件实现的。这是一件美丽的事情!这个想法并不复杂,但它非常好。他们让 you 为非模块化 jar 定义 module-info.java。我有说过我已经喜欢它了吗?

标签: java gradle java-9 java-platform-module-system hdrhistogram


【解决方案1】:

不幸的是,gradle 并没有将每个 jar 都视为一个模块(简单来说)。如果您想了解究竟是如何gradle 构建module-path(而不是class-path),您可能希望从here 开始,特别是isModuleJar 方法.您尝试使用的依赖项很容易理解(尽管我花了将近两天的时间来设置 gradle 并调试问题):gradle 说它不是一个模块(它没有错,但是我也不确定它是否正确)。为了使其非常正确,gradlewill 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 commiter 编写的插件:

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

你的情况最简单的选择是:

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

【讨论】:

  • 这太棒了!非常感谢@Eugene。但总的来说,这些天似乎很少有人使用模块+gradle。
猜你喜欢
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 2018-04-15
  • 2020-09-28
  • 2019-09-11
  • 1970-01-01
  • 2020-09-24
  • 2018-06-01
相关资源
最近更新 更多