猿问

在 Gradle 中编译一个 JDK 8 项目 + 一个 JDK 9“模块信息.java”

我正在开发一个针对JDK 8的Java库,我正在使用OpenJDK 11在Gradle 5中构建它。为了瞄准JDK 8,我是javac的--release选项。


但是,我也希望我的库与JPMS兼容。换句话说:


我想提供一个编译的(斯蒂芬·科尔伯恩量表的选项3),module-info.class--release 9

而其余的都是用 编译的。--release 8

断续器

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 sets for--module-pathcompileJava


**目前还没有Gradle DSL:#2510--release


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 编译,但所有类(而不是仅)都采用 JDK 9 类格式 (v.53)。module-info.class

其他构建工具

我想做的当然是可能的:

  1. 马文

    • 例如ThreeTen-Extra(他们的方法归结为:首先编译所有内容,然后编译除使用之外的所有内容)。--release 9module-info.java--release 8

  2. 蚂蚁

    • 例如,龙目岛(他们的方法归结为:在单独的“源代码集”中拥有 - 主源代码集编译,“模块信息”源代码集编译)。module-info.java--release 8--release 9


肥皂起泡泡
浏览 379回答 2
2回答

慕斯709654

自 1.5.0 版起,Gradle Modules Plugin 现在支持此功能。下面是一个工作代码段:build.gradleplugins {    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删除自定义源代码集(不是必需的)添加自定义任务并将其设置为任务的类路径(灵感来自此 Gradle 手册compileModuleInfoJava--module-pathcompileJava)以下是的完整源代码:build.gradleplugins {    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 compileJavaclasses.dependsOn compileModuleInfoJava笔记:它编译 👍我验证了 JDK 9 格式(第 8 个字节→ v.53),而其他类是 JDK 8 格式(第 8 个字节→ v.52) 👍module-info.class0x350x34但是,禁用是不令人满意的,因为这意味着测试将不再在模块路径上运行,等等。 👎org.javamodularity.moduleplugin

杨魅力

我为此开发了一个Gradle插件:https://github.com/Glavo/module-info-compiler我试过Gradle Modules插件,但是还有一些麻烦的问题,所以我开发了这个插件,一个专门用于编译的编译器。module-info.java它不是通过调用javac来实现的。它是一个完整的编译器,可以在Java 8上运行。它识别的语法,并根据它生成相应的文件。module-info.javamodule-info.class它只检查语法,实际上不检查那些包,类或模块,因此它可以在不配置任何模块路径的情况下工作。这个Gradle插件已经为您处理了所有内容。对于包含 的 Java 8 项目,您只需要执行以下操作:module-info.javaplugins {    id("java")    id("org.glavo.compile-module-info-plugin") version "2.0"}tasks.compileJava {    options.release.set(8)}
随时随地看视频慕课网APP

相关分类

Java
我要回答