【问题标题】:how to build project for different sourceCompatibility and targetCompatibility in gradle如何在gradle中为不同的sourceCompatibility和targetCompatibility构建项目
【发布时间】:2018-08-30 04:07:16
【问题描述】:

我当前在 gradle 文件中的配置是

sourceCompatibility = 1.7
targetCompatibility = 1.7

此规范使我的项目特定于 java 1.7。

我的要求是我应该能够为不同的 java 版本(如 java 1.7 和 java 1.8)构建我的项目

PS:就像在 gradle 中构建配置文件一样,我们可以指定不同的 java 版本。

【问题讨论】:

    标签: gradle build.gradle


    【解决方案1】:

    Gradle 使用它在 PATH 或 JAVA_HOME 中找到的任何 JDK。因此,如果您删除 sourceCompatibility 和 targetCompatibility 它应该使用运行项目的机器上使用的 Java 版本构建项目。当然,这确实意味着您不应该在代码中包含像 lambdas 这样的构造,否则 Java 7 上的编译将失败。

    您还应该知道,从 Gradle 5 开始,对 Java 7 的支持将被删除,它将仅在 Java 8(或更新版本)上运行。

    另一种方法是在运行时指定JDK,请参阅link

    如果你想同时为多个 Java 版本构建,你可以使用这样的东西:

    task compile7(type: JavaCompile) {
       source = fileTree(dir: 'src', include: '**/*.java')
       classpath = sourceSets.main.compileClasspath
       sourceCompatibility = 1.7
       targetCompatibility = 1.7
       destinationDir = file('build/java7')
    }
    task jar7(type: Jar, dependsOn: compile7) {
       from('build/java7')
       archiveName = 'project-JDK7.jar'
       destinationDir = file('build/jars')
    }
    task compile8(type: JavaCompile) {
       source = fileTree(dir: 'src', include: '**/*.java')
       classpath = sourceSets.main.compileClasspath
       sourceCompatibility = 1.8
       targetCompatibility = 1.8
       destinationDir = file('build/java8')
    }
    task jar8(type: Jar, dependsOn: compile8) {
       from('build/java8')
       archiveName = 'project-JDK8.jar'
       destinationDir = file('build/jars')
    }
    

    您可以调用gradle jar7 jar8 为您想要的两个java 版本构建jar。当然,上面的代码可以改进为参数化操作,像这样:

    ext.javaVer = project.hasProperty('javaVer') ? project.getProperty('javaVer') : '1.7'
    task compileJ(type: JavaCompile) {
       source = fileTree(dir: 'src', include: '**/*.java')
       classpath = sourceSets.main.compileClasspath
       sourceCompatibility = javaVer
       targetCompatibility = javaVer
       destinationDir = file('build/' + javaVer)
    }
    task jarJ(type: Jar, dependsOn: compileJ) {
       from('build/' + javaVer)
       archiveName = 'project-' + javaVer + '.jar'
       destinationDir = file('build/jars')
    }
    

    使用这种格式,您可以调用 gradle jarJ -P javaVer=1.8gradle jarJ 来构建 Java 8 和 Java 7。

    【讨论】:

    • 是否可以通过命令行传递java版本来构建项目?
    • 我的要求是一次构建一个war文件。我一直在寻找这样的解决方案:我从命令行读取变量并将其值分配给 sourceCompability 和 targetCompability
    • 如果 gradle 在我的机器上使用 1.8 的 jvm,那么为什么当我的应用引用仅从 Android N 开始支持的方法时它无法构建,为什么我必须明确声明 targetCompatibility 为 1_8 ?
    • 如果 targetCompatibility 与 sourceCompatibility 相同,则可以省略。我不能说为什么你的构建失败,没有任何例外。此外,它是否因为缺少来自 JKD 或来自 Android API 的方法而失败?另见stackoverflow.com/questions/35928580/…
    【解决方案2】:

    我就是这样解决的

    ext.javaVer = project.hasProperty('javaVer') ? project.getProperty('javaVer') : '1.7'
    sourceCompatibility = javaVer
    targetCompatibility = javaVer
    

    在构建项目时

    gradle build -P javaVer=1.8
    

    【讨论】:

    • 最新的gradle 版本可能需要使用JavaVersion 枚举,因此请尝试:gradle ext.javaVer = project.hasProperty('javaVer') ? JavaVersion.toVersion(project.getProperty('javaVer')) : JavaVersion.VERSION_1_7
    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2017-11-08
    • 1970-01-01
    相关资源
    最近更新 更多