为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

肥皂起泡泡 2022-08-03 11:02:35
我正在开发一个针对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--releasesrc/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.Valuepublic class Sample {  int sample;}此 MCVE 编译,但所有类(而不是仅)都采用 JDK 9 类格式 (v.53)。module-info.class其他构建工具我想做的当然是可能的:马文例如ThreeTen-Extra(他们的方法归结为:首先编译所有内容,然后编译除使用之外的所有内容)。--release 9module-info.java--release 8蚂蚁例如,龙目岛(他们的方法归结为:在单独的“源代码集”中拥有 - 主源代码集编译,“模块信息”源代码集编译)。module-info.java--release 8--release 9
查看完整描述

2 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

自 1.5.0 版起,Gradle Modules Plugin 现在支持此功能。


下面是一个工作代码段: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

删除自定义源代码集(不是必需的)

添加自定义任务并将其设置为任务的类路径(灵感来自此 Gradle 手册compileModuleInfoJava--module-pathcompileJava)

以下是的完整源代码: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

笔记:

  • 它编译 👍

  • 我验证了 JDK 9 格式(第 8 个字节→ v.53),而其他类是 JDK 8 格式(第 8 个字节→ v.52) 👍module-info.class0x350x34

  • 但是,禁用是不令人满意的,因为这意味着测试将不再在模块路径上运行,等等。 👎org.javamodularity.moduleplugin


查看完整回答
反对 回复 2022-08-03
?
杨魅力

TA贡献1811条经验 获得超6个赞

我为此开发了一个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.java


plugins {

    id("java")

    id("org.glavo.compile-module-info-plugin") version "2.0"

}


tasks.compileJava {

    options.release.set(8)

}


查看完整回答
反对 回复 2022-08-03
  • 2 回答
  • 0 关注
  • 378 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号