Gradle构建中未解决的Kotlin扩展函数的引用

时间:2016-05-27 09:50:41

标签: gradle extension-methods kotlin

我有多项目Gradle构建,其中包含用Kotlin编写的所有代码。它有两个项目:普通和客户。子项目位于中间文件夹中,例如“demo”。所以文件夹结构是:

project
  demo
    client
      build.gradle
    common
      build.gradle
  build.gradle
  gradle.properties
  settings.gradle

settings.gradle:

rootProject.name = 'demo'

include 'demo/client'
include 'demo/common'

客户端依赖于公共项目compile project(":demo/common")。共同项目中有一个扩展功能:

fun <T> List<Future<T>>.getAll(): Long {
    var count = 0L
    this.forEach {
        it.get()
        count++
    }
    return count
}

如果我尝试在客户端项目中使用它,我会在编译时遇到Unresolved reference: getAll异常。用法:

...
import org.sandbox.imdg.hazelcast.common.utils.getAll

class CassLoader {

    fun loadCalcData(): Long {
        ...
        val futures: List<Future<CalcData>> = items.map { map.putAsync(it.getKey(), it) }
        return futures.getAll()
    }
}

同时,如果我在客户端项目中放置getAll声明,则一切正常。我很确定该函数的导入是正确的,但同时我对Gradle有一点经验,所以可能会遗漏一些东西。

  • 构建:gradlew clean build
  • Kotlin:1.0.2
  • Gradle:2.9

UPD:问题在于文件夹结构(或者可能是我声明依赖关系错误...) - 如果我删除了中间文件夹演示,则每个人都可以。

2 个答案:

答案 0 :(得分:2)

好的,问题出在gradle.settings中错误的子项目中。应该是

NSBitmapImageFileType

而不是

include 'demo:common'
include 'demo:client'

然后是依赖项include 'demo/common' include 'demo/client'

答案 1 :(得分:1)

检查您是否在根settings.gradle中包含了这两个项目。

使用最少的工作设置检查this Gist

<强> settings.gradle

rootProject.name = 'demo'

include 'client'
include 'common'

<强>的build.gradle

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
    }
}

subprojects {
    apply plugin: 'kotlin'

    repositories {
        jcenter()
        maven {
            url "http://repository.jetbrains.com/all"
        }
    }

    dependencies {
        compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
    }
}

<强>公共/ SRC /主/科特林/通过的/ dev / madhead /演示/普通/ Funktions.kt

package by.dev.madhead.demo.common

fun String.revert(): String {
    return this.reversed()
}

<强>的客户机/的build.gradle

dependencies {
    compile project(':common')
}

<强>的客户机/ SRC /主/科特林/通过的/ dev / madhead /演示/客户端/ App.kt

package by.dev.madhead.demo.client

import by.dev.madhead.demo.common.revert

fun main(args: Array<String>) {
    println("Hello".revert())
}