Java gradle中的多释放罐

Java gradle中的多释放罐,java,gradle,build.gradle,java-9,multi-release-jar,Java,Gradle,Build.gradle,Java 9,Multi Release Jar,有一段时间我一直在绞尽脑汁,试图将我的库设置为使用多版本JAR,以便在备份java 8实现中使用java 9+功能。然而,它只是我的项目的一个模块所需要的 模块的当前build.gradle如下所示: apply plugin: 'java' apply plugin: 'java-library' dependencies { compile project(":common") compile 'org.ow2.asm:asm:6.2' compile 'org.

有一段时间我一直在绞尽脑汁,试图将我的库设置为使用多版本JAR,以便在备份java 8实现中使用java 9+功能。然而,它只是我的项目的一个模块所需要的

模块的当前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中刷新my build.gradle会导致以下错误:
在org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler类型的对象上找不到参数[file collection]的java9Implementation()方法。


我还应该注意到这是在gradle 4.8.1上。

您的问题是,
源集
是在
依赖项
块之后定义的。把它放在依赖项之上,它应该可以工作

您使用的示例也解释了这一点:

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


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

可能会对您有所帮助,并且?@nullpointer My build.gradle实际上基于这些链接。我还发现了另外两个build.gradles,据我所知,应该没有什么问题——但确实有。