在Gradle中编译一个JDK 8项目+一个JDK 9模块-info.java [英] Compile a JDK 8 project + a JDK 9 "module-info.java" in Gradle

查看:0
本文介绍了在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-pathForcompileJava

**尚无适用于--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)。

其他生成工具

我想做的事情在以下位置肯定是可能的:

  1. Maven
    • 例如ThreeTen-Extra(他们的方法归结为:先用--release 9编译所有东西,然后用--release 8编译除了module-info.java以外的所有东西)。
  2. 蚂蚁
    • 例如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-pathmain
  • 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

好的,我设法让它工作了:

  1. 禁用org.javamodularity.moduleplugin
  2. 正在删除自定义源集(不需要)
  3. 添加自定义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字节是0x35v.53),其他类是JDK 8格式(8字节是0x34v.52)👍
  • 然而,禁用org.javamodularity.moduleplugin并不令人满意,因为这意味着测试将不再在模块路径等上运行。👎

这篇关于在Gradle中编译一个JDK 8项目+一个JDK 9模块-info.java的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆