3

一段时间以来,我一直在摸不着头脑,试图设置我的库以使用多版本 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 中刷新我的 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 上。

4

1 回答 1

1

你的问题是,你是在块sourceSet之后定义的。dependencies把它放在上面dependencies,它应该可以工作。

您使用的参考资料也解释了它:

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

所以在你可以使用'java9'实现之前,gradle需要知道'java9'应该是什么意思。

于 2020-06-14T15:10:13.383 回答