【问题标题】:How to create a custom task in gradle to pack java and kotlin code to a jar?如何在 gradle 中创建自定义任务以将 java 和 kotlin 代码打包到 jar 中?
【发布时间】:2019-07-11 21:55:56
【问题描述】:

我们有一个多模块设置,我们在模块之间共享一些测试类(主要是 Fakes 实现)。我们当前的解决方案(您可以在下面找到)仅适用于用 Java 编写的类,但我们正在考虑支持共享的 kotlin 类。

if (isAndroidLibrary()) {
    task compileTestCommonJar(type: JavaCompile) {
        classpath = compileDebugUnitTestJavaWithJavac.classpath
        source sourceSets.testShared.java.srcDirs
        destinationDir = file('build/testCommon')
    }
    taskToDependOn = compileDebugUnitTestSources
} else {
    task compileTestCommonJar(type: JavaCompile) {
        classpath = compileTestJava.classpath
        source sourceSets.testShared.java.srcDirs
        destinationDir = file('build/testCommon')
    }
    taskToDependOn = testClasses
}

task testJar(type: Jar, dependsOn: taskToDependOn) {
    classifier = 'tests'
    from compileTestCommonJar.outputs
}

如何修改 compileTestCommonJar 使其支持 kotlin?

【问题讨论】:

  • 你说的在模块之间共享一些测试类到底是什么意思?这些是实际测试还是只是用于不同项目测试的类?
  • 只是类,伪造实现以避免使用模拟
  • 所以基本上你的测试依赖于那些类?你为什么不在一个额外的模块中编译这些类,并将这个模块作为testCompiletestImplementation 依赖添加到你的其他模块中。
  • 我已经有太多的模块,而 imo 这将是一种解决方法。我已经有了一个使用 Java 文件的可行解决方案……只是想通过编译 Kotlin 代码来使其更灵活
  • 使用模块来实现代码可重用性并不是一种解决方法。相反,在 Gradle 构建中手动和有条件地创建任务就是其中之一。

标签: gradle kotlin


【解决方案1】:

这是我们的工作:

  1. 在具有共享测试类的模块中,将 test 源集输出打包到 jar 中
configurations { tests }
...
task testJar(type: Jar, dependsOn: testClasses) {
    baseName = "test-${project.archivesBaseName}"
    from sourceSets.test.output
}

artifacts { tests testJar }
  1. 在依赖于共享类的模块中
dependencies {
  testCompile project(path: ":my-project-with-shared-test-classes", configuration: "tests")
}

PS:老实说,我更希望有一个单独的 Gradle 模块和通用测试类,因为它是更明确的解决方案。

【讨论】:

    【解决方案2】:

    task compileTestCommonJar(type: JavaCompile) 编译 .java 文件只是因为它是 JavaCompile 类型的任务。

    还有KotlinCompile 任务,所以你需要合并它,它基本上与JavaCompile 类似,但只编译.kt 文件。

    说我不会使用任务系统来共享依赖关系,我会使用单独的模块并使用默认的compileTestKotlincompileTestJava任务的outputs

    【讨论】:

    • 无法为 org.gradle.api.Project 类型的项目 ':project' 获取未知属性 'KotlinCompile'。
    • 需要导入 org.jetbrains.kotlin.gradle.dsl.KotlinCompile
    • 非常感谢伙计,但我仍然遇到问题:Cannot create a proxy class for abstract class 'KotlinCompile' 我很确定我在创建问题之前尝试过这个,但无论如何感谢您的建议
    • 其实我认为导入应该是org.jetbrains.kotlin.gradle.tasks.KotlinCompile,而不是org.jetbrains.kotlin.gradle.dsl.KotlinCompile
    • @sschuberth 如何导入org.jetbrains.kotlin.gradle.tasks.KotlinCompile 想法似乎无法解决。知道怎么做吗?
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多