gradle中的多版本jars

问题描述 投票:2回答:1

我已经摸索了一段时间,尝试设置我的库以使用多发行版jar来将Java 9+功能与备份Java 8实现一起使用。但是,只需要我的项目的一个模块。

我当前用于模块的build.gradle看起来像这样:

apply plugin: 'java'
apply plugin: 'java-library'

dependencies {
    compile project(":common")

    compile 'org.ow2.asm:asm:6.2'
    compile 'org.ow2.asm:asm-util:6.2'

    testCompile "junit:junit:$junit_version"
    testCompileOnly "com.google.auto.service:auto-service:$autoservice_version"

    java9Implementation files(sourceSets.main.output.classesDirs) { builtBy compileJava }
}

compileJava {
    sourceCompatibility = 8
    targetCompatibility = 8
    options.compilerArgs.addAll(['--release', '8'])
}

compileJava9Java {
    sourceCompatibility = 9
    targetCompatibility = 9
    options.compilerArgs.addAll(['--release', '9'])
}

sourceSets {
    java9 {
        java {
            srcDirs = ['src/main/java9']
        }
    }

}

jar {
    into('META-INF/versions/9') {
        from sourceSets.java9.output
    }

    manifest {
        attributes(
                "Manifest-Version": "1.0",
                "Multi-Release": true
        )
    }
}

但是在intellij中刷新build.gradle却让我收到此错误:Could not find method java9Implementation() for arguments [file collection] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

我还要注意,这是在gradle 4.8.1上。

java gradle build.gradle java-9 multi-release-jar
1个回答
0
投票

您的问题是,sourceSet是在dependencies块之后定义的。将其放在dependencies上方,应该可以使用。

您使用的reference也对其进行了解释:

源集表示将要一起编译的一组源。一个jar是根据一个或多个源集的编译结果来构建的。对于每个源集,Gradle将自动创建一个您可以配置的相应编译任务。这意味着,如果我们有Java 8的源代码和Java 9的源代码,那么它们应该位于单独的源代码集中。这就是我们通过创建特定于Java 9的源集来完成的,该源集将包含类的专用版本。

因此,在使用'java9'实现之前,gradle需要知道'java9'的含义。

© www.soinside.com 2019 - 2024. All rights reserved.