Java模块,Gradle项目-外部库问题



我在IntelliJ中有一个多模块项目,一个java库项目,使用Gradle和相当旧的库版本我必须说,现在切换到Java 11(现在使用OpenJDK 11.0.2从https://jdk.java.net/archive/)。

我想模块化该库项目,添加到所有模块的module-info.java。我不断得到一个错误的模块与其中一个依赖关系,Saxon-HE

我将该模块隔离在一个单独的项目中(使用Gradle 7.6),并根据IntelliJ发现的情况一步一步地修改build.gradle依赖项在使用最新版本的依赖项时导入错误。

项目的build.gradle如下所示:

plugins {
id 'java'
}
group 'org.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}
test {
useJUnitPlatform()
}

模块的build.gradle看起来像这样,直到Saxon-HE出现错误。

plugins {
id 'java'
}
group 'org.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1'
implementation group: 'org.jdom', name: 'jdom2', version: '2.0.6.1'
implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.12.0'
implementation group: 'commons-io', name: 'commons-io', version: '2.11.0'
implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.6'
implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '4.10.0'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}
test {
useJUnitPlatform()
}

module-info.java看起来是这样的,我使用了IntelliJ的建议,所以它自动添加了requires语句:

module mymodule1 {
requires org.apache.commons.lang3;
requires org.apache.commons.io;
requires org.slf4j;
requires okhttp3;
requires okio;
requires java.xml;
requires org.jdom2;
}

IntelliJ在构建时发现的下一个导入错误结果是因为我的一个类有import语句:

import net.sf.saxon.xpath.XPathFactoryImpl;

构建项目导致错误:

error: package net.sf.saxon.xpath does not exist
import net.sf.saxon.xpath.XPathFactoryImpl;

查看https://mvnrepository.com/artifact/net.sf.saxon/Saxon-HE/11.4我添加到模块的build.gradle:

implementation group: 'net.sf.saxon', name: 'Saxon-HE', version: '11.4'

IntelliJ中,我可以看到在Project导航器视图中,在External Libraries中有

Gradle: net.sf.saxon.Saxon-HE:11.4 
Saxon-HE-11.4.jar

IntelliJ推荐

Add 'requires Saxon.HE' directive to module-info.java

module-info.java现在看起来像这样:

module mymodule1 {
requires org.apache.commons.lang3;
requires org.apache.commons.io;
requires org.slf4j;
requires okhttp3;
requires okio;
requires java.xml;
requires org.jdom2;
requires Saxon.HE;
}

在使用import语句的特定类中的错误消失之后,IntelliJ不会抱怨。

但是当构建项目时,我得到错误

C:UsersMEPROJECTSmyprojectmymodule1srcmainjavamodule-info.java:9: error: module not found: Saxon.HE
requires Saxon.HE;
^

删除requires Saxon.HE并构建项目会导致错误:

error: package net.sf.saxon.xpath is not visible
import net.sf.saxon.xpath.XPathFactoryImpl;
^
(package net.sf.saxon.xpath is declared in the unnamed module, but module net.sf.saxon.xpath does not read it)

我发现这个错误消息很奇怪,因为它说but module net.sf.saxon.xpath does not read it,我宁愿期待but module mymodule1 does not read it.

我不知道出了什么问题,其他外部依赖没有问题,但Saxon-HE是。

我在这里找到了Gradle build - add模块路径的一个片段,可能解决了这个问题,但可能只是部分,所以不确定这个答案是否可以被标记为解决方案。

我添加到项目build.gradle

subprojects {
apply plugin: 'java'
sourceCompatibility = 19
targetCompatibility = 19
compileJava {
doFirst {
options.compilerArgs += [
'--module-path', classpath.asPath,
'-Xmaxerrs', 1000
]
classpath = files()
}
}
}

现在试图构建它(与Gradle 7.6OpenJDK 19),它不抱怨没有找到模块,至少到目前为止,但现在我有下一个问题,我在这里描述Java模块,Gradle,外部依赖关系-模块从多个读取