使用gradle依赖Java9模块系统库中的遗留jar 问题
如何创建同时满足以下两个条件的java库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。(如
)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")
}
}