Gradle中的多版本JAR包

3

我一直在苦思冥想如何设置我的库以使用多版本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时,我遇到了以下错误:

在类型为org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler的对象上找不到方法java9Implementation(),其参数为[file collection]。

需要注意的是,这是在Gradle 4.8.1上发生的。


1
这个链接可能对你有所帮助:https://github.com/melix/mrjar-gradle#building-a-mrjar-with-gradle,还有这个链接:https://blog.gradle.org/mrjars#how-to-create-a-multi-release-jar-with-gradle。 - Naman
@nullpointer 我的 build.gradle 实际上是基于那些链接的。我还找到了另外几个 build.gradle,据我所知,应该没有任何问题 - 但是确实有问题。 - austinv11
1个回答

1
你的问题是,你的sourceSetdependencies块之后定义。将其放在dependencies之前应该就可以解决问题了。
你使用的参考文献也解释了这一点:

源集表示将一起编译的一组源代码。一个jar文件是从一个或多个源集的编译结果构建的。对于每个源集,Gradle都会自动创建相应的编译任务,您可以进行配置。这意味着如果我们有Java 8的源代码和Java 9的源代码,那么它们应该存在于不同的源集中。这就是我们通过创建一个专门包含类的特定的Java 9源集所做的。

因此,在使用'java9'Implementation之前,gradle需要知道'java9'应该表示什么。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接