本文介绍了在Gradle中编译一个JDK 8项目+一个JDK 9模块-info.java的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在开发一个面向JDK 8的Java库,我正在使用OpenJDK 11在Gradle 5中构建它。为了面向JDK 8,我是javac的--release
选项。
但是,我也希望我的库与JPMS兼容。换句话说:
我想提供一个用--release 9
(Stephen Colebourne’s scale中的选项3)编译的module-info.class
,
而其余所有内容都是用--release 8
编译的。
MCVE
build.gradle:
plugins {
id 'java'
id 'org.javamodularity.moduleplugin' version '1.4.1' // *
}
repositories {
mavenCentral()
}
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.6'
}
compileJava.options.compilerArgs.addAll(['--release', '9']) // **
*org.javamodularity.moduleplugin
集合--module-path
ForcompileJava
**尚无适用于--release
的Gradle DSL:#2510
src/main/java/module-info.java:
module pl.tlinkowski.sample {
requires lombok;
exports pl.tlinkowski.sample;
}
src/main/java/pl/tlinkowski/sample/Sample.java:
package pl.tlinkowski.sample;
@lombok.Value
public class Sample {
int sample;
}
此MCVE已编译,但所有类(而不仅仅是module-info.class
)都是JDK 9类格式(v.53)。
其他生成工具
我想做的事情在以下位置肯定是可能的:
-
Maven
例如ThreeTen-Extra(他们的方法归结为:先用--release 9
编译所有东西,然后用--release 8
编译除了module-info.java
以外的所有东西)。
蚂蚁
例如Lombok(他们的方法归结为:将module-info.java
放在单独的”源集合”中–主源集合用--release 8
编译,模块信息源集用--release 9
编译)。
我尝试的内容
我喜欢Lombok的方法,所以我对build.gradle
中的源集进行了如下操作:
sourceSets {
main { // all but module-info
java {
exclude 'module-info.java'
}
}
mainModuleInfo { // module-info only
java {
srcDirs = ['src/main/java']
outputDir = file("$buildDir/classes/java/main")
include 'module-info.java'
}
}
}
然后,我配置了一个任务依赖项,并向两个编译任务添加了适当的--release
选项:
classes.dependsOn mainModuleInfoClasses
compileJava.options.compilerArgs.addAll(['--release', '8'])
compileMainModuleInfoJava.options.compilerArgs.addAll(['--release', '9'])
如果我现在编译,我会得到:
错误:Lombok包不存在
所以我仍然不知道如何指导org.javamodularity.moduleplugin
:
不使用--module-path
main
为mainModuleInfo
设置正确的--module-path
推荐答案
编辑:自1.5.0版本起,Gradle模块插件现在支持此功能。
这里是一个工作的build.gradle
片段:
plugins {
id 'java'
id 'org.javamodularity.moduleplugin' version '1.5.0'
}
repositories {
mavenCentral()
}
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.6'
}
modularity.mixedJavaRelease 8
好的,我设法让它工作了:
-
禁用
org.javamodularity.moduleplugin
正在删除自定义源集(不需要)
添加自定义
compileModuleInfoJava
任务并将其--module-path
设置为compileJava
任务的类路径(灵感来自this Gradle manual)
以下是build.gradle
的完整源代码:
plugins {
id 'java'
}
repositories {
mavenCentral()
}
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.6'
}
compileJava {
exclude 'module-info.java'
options.compilerArgs = ['--release', '8']
}
task compileModuleInfoJava(type: JavaCompile) {
classpath = files() // empty
source = 'src/main/java/module-info.java'
destinationDir = compileJava.destinationDir // same dir to see classes compiled by compileJava
doFirst {
options.compilerArgs = [
'--release', '9',
'--module-path', compileJava.classpath.asPath,
]
}
}
compileModuleInfoJava.dependsOn compileJava
classes.dependsOn compileModuleInfoJava
备注:
它编译👍
我验证了module-info.class
是JDK 9格式(8字节是0x35
→v.53),其他类是JDK 8格式(8字节是0x34
→v.52)👍
然而,禁用org.javamodularity.moduleplugin
并不令人满意,因为这意味着测试将不再在模块路径等上运行。👎
这篇关于在Gradle中编译一个JDK 8项目+一个JDK 9模块-info.java的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,