Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用gradle依赖Java9模块系统库中的遗留jar 问题_Java_Gradle_Java 9_Java Platform Module System_Unnamed Module - Fatal编程技术网

使用gradle依赖Java9模块系统库中的遗留jar 问题

使用gradle依赖Java9模块系统库中的遗留jar 问题,java,gradle,java-9,java-platform-module-system,unnamed-module,Java,Gradle,Java 9,Java Platform Module System,Unnamed Module,如何创建同时满足以下两个条件的java库jar: 是java模块(具有模块信息) 有一个依赖的遗留(非模块)jar。(如commons exec) 依赖项是一个实现细节-不应导出 来源 具有以下build.gradle(使用gradle-6.8): 以及以下模块信息.java: module test.module { requires commons.exec; } 错误 我得到以下编译错误: module-info.java:2: error: module not found

如何创建同时满足以下两个条件的java库jar:

  • 是java模块(具有
    模块信息
  • 有一个依赖的遗留(非模块)jar。(如
    commons exec
依赖项是一个实现细节-不应导出

来源 具有以下
build.gradle
(使用
gradle-6.8
):

以及以下
模块信息.java

module test.module {
    requires commons.exec;
}
错误 我得到以下编译错误:

module-info.java:2: error: module not found: commons.exec
    requires commons.exec;
                    ^
如果我没有包含
requires commons.exec
,则错误为:

error: package org.apache.commons.exec is not visible
import org.apache.commons.exec.CommandLine;
                         ^
  (package org.apache.commons.exec is declared in the unnamed module,
   but module test.module does not read it)
commons.exec
模块名称? 运行
jar--file=commons-exec-1.3.jar--descripe模块
会输出:

No module descriptor found. Derived automatic module.

commons.exec@1.3 automatic
requires java.base mandated
contains org.apache.commons.exec
contains org.apache.commons.exec.environment
contains org.apache.commons.exec.launcher
contains org.apache.commons.exec.util

因此
commons.exec
看起来像是
commons-exec-1.3.jar的有效模块名。Intelij的想法似乎是一致的,并在
module info.java
中自动完成。尽管它在构建时失败。

我使用插件解决了同样的问题

此插件允许您将模块信息添加到Java库中 那没有任何问题。如果你这样做,你可以给它一个适当的 模块名和Gradle可以将其提取到模块路径上 在编译、测试和执行期间

将此部分添加到您的
build.gradle
中,以添加commons exec模块信息

  extraJavaModuleInfo {
    module("commons-exec-1.3.jar", "org.apache.commons.exec", "1.3") {
        exports("org.apache.commons.exec")
    }
}
添加
需要org.apache.commons.exec到您的
模块信息.java

编辑1

Gradle7.0完全支持Java模块系统。用户现在可以通过Gradle访问Java模块。只要存在
moduleinfo.java
,Gradle就会推断出您的jar是一个模块,必须放在modulepath上,而不是传统的类路径上

plugins {
   id 'java-library'
   id("de.jjohannes.extra-java-module-info") version "0.6"
}
  extraJavaModuleInfo {
    module("commons-exec-1.3.jar", "org.apache.commons.exec", "1.3") {
        exports("org.apache.commons.exec")
    }
}