我在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.6
和OpenJDK 19
),它不抱怨没有找到模块,至少到目前为止,但现在我有下一个问题,我在这里描述Java模块,Gradle,外部依赖关系-模块从多个读取