程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在Gradle中编译JDK 8项目+ JDK 9“ module-info.java”大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决在Gradle中编译JDK 8项目+ JDK 9“ module-info.java”?

开发过程中遇到在Gradle中编译JDK 8项目+ JDK 9“ module-info.java”的问题如何解决?下面主要结合日常开发的经验,给出你关于在Gradle中编译JDK 8项目+ JDK 9“ module-info.java”的解决方法建议,希望对你解决在Gradle中编译JDK 8项目+ JDK 9“ module-info.java”有所启发或帮助;

编辑: Gradle Modules Plugin 从1.5.0版本开始支持此功能。

这是一个工作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-pathcompileJava任务的类路径(受此Gradle手册的启发)

这是的完整源代码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 8的Java库,并且正在使用OpenJDK 11在Gradle 5中进行构建。为了实现JDK
    8,我是javac的--release选择。

    但是,我也希望我的库兼容JPMS。换一种说法:

    • 我想提供一个@H_729_9@module-info.class编译器--release 9(Stephen Colebourne量表的选项3 ),
    • 其余的全部使用编译--release 8
    @H_941_69@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-pathcompileJava

    **尚无Gradle DSL
    --release:#2510

    src / main / java / module-info.java

    @H_729_9@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会进行编译,但是所有类(而不是only @H_729_9@module-info.class)都是JDK
    9类格式(v.53)。

    其他构建工具

    我想做的事情当然有可能在:

    1. 马文
      • 例如ThreeTen-EXTRA(他们的方法可以归结为:第一编译一切用--release 9,然后编译一切除了@H_729_9@module-info.java用--release 8)。
    2. 蚂蚁
      • 例如Lombok(他们的方法归结为:@H_729_9@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'])
    

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

    所以我仍然 不知道 如何指导org.javamodularity.moduleplugin

    • --module-path用于@H_729_9@main
    • 设置适当--module-path的@H_729_9@mainModuleInfo

大佬总结

以上是大佬教程为你收集整理的在Gradle中编译JDK 8项目+ JDK 9“ module-info.java”全部内容,希望文章能够帮你解决在Gradle中编译JDK 8项目+ JDK 9“ module-info.java”所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。