如何在库jar中打包扩展功能?

时间:2018-08-26 13:00:05

标签: gradle intellij-idea kotlin-extension

我有一组扩展功能,我想打包到jar中并包含在项目中,但是我似乎无法从jar中评估扩展功能。我可以从同一个jar中访问非扩展函数。

例如,如果我在Idea中创建一个包含以下文件的项目,然后构建jar。

package mypackagename.swtbuilder

import org.eclipse.swt.SWT
import org.eclipse.swt.widgets.*

fun myFun() {
    println("here")
}


fun Composite.tree(treeStyle: Int = SWT.NONE, init: Tree.() -> Unit): Tree {
    val treeWidget = Tree(this, treeStyle)
    treeWidget.init()
    return treeWidget
}

然后使用build.gradle文件中的类似内容将jar作为依赖项包含在另一个项目中。

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    compile "org.eclipse.swt:org.eclipse.swt.gtk.linux.x86_64:4.5.2"
    compile files('/home/john/development/swt-builder/build/libs/swt-builder-1.0-SNAPSHOT.jar')

}

我可以在新项目中使用myFun,但是所有扩展功能都无法解析。

import mypackagename.swtbuilder.myFun  // this import works
import mypackagename.swtbuilder.tree  // this import is "grayed out"

fun main(args: Array<String>) {

    val display = Display()
    myFun()  // this function call works
    val myTree = tree {    // tree is un-resolved
    }
}

我需要怎么做才能使扩展功能可见?

1 个答案:

答案 0 :(得分:0)

愚蠢的错误,扩展函数是可见的,只需要在它们扩展的对象的上下文中调用它们即可。在这种情况下,Shell是Composite的子类。当扩展和主体位于同一项目中时,我的所有工作都很好。我试图使扩展成为一个单独的库,并且先于尝试确保正确导入了扩展。

fun main(args: Array<String>) {
    val display = Display()
    val myShell = shell {
        tree { }
    }
    myShell.open()
    while (!myShell.isDisposed) {
        if (!display.readAndDispatch()) display.sleep()
    }
    display.dispose()
}