gpt4 book ai didi

java - 在 Gradle 中编译一个 JDK 8 项目 + 一个 JDK 9 "module-info.java"

转载 作者:行者123 更新时间:2023-12-01 14:21:18 25 4
gpt4 key购买 nike

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

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

  • 我想提供一个module-info.class--release 9 编译(Stephen Colebourne's scale 中的选项 3),
  • 而其余的都是用 --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对于 compileJava
    ** --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 )。

    其他构建工具

    我想做的当然是可能的:
  • 马文
  • 例如 ThreeTen-Extra (他们的方法归结为:首先使用 --release 9 编译所有内容,然后使用 module-info.java 编译除 --release 8 之外的所有内容)。
  • Ant
  • 例如。 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'])

    如果我现在编译,我得到:

    error: package lombok does not exist



    所以还是不知道怎么指导 org.javamodularity.moduleplugin到:
  • 不使用 --module-path对于 main
  • 设置正确--module-path对于 mainModuleInfo
  • 最佳答案

    编辑:自版本 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-pathcompileJava 的类路径任务(受 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不令人满意,因为这意味着测试将不再在模块路径上运行等。👎
  • 关于java - 在 Gradle 中编译一个 JDK 8 项目 + 一个 JDK 9 "module-info.java",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55100737/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com