【问题标题】:How do I package extension functions in a library jar?如何在库 jar 中打包扩展功能?
【发布时间】:2018-08-26 13:00:05
【问题描述】:

我有一组扩展函数,我想将它们打包到 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
    }
}

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

【问题讨论】:

    标签: gradle intellij-idea kotlin-extension


    【解决方案1】:

    愚蠢的错误,扩展函数是可见的,它们只需要在它们是扩展的对象的上下文中调用。在这种情况下,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()
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-21
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 2021-09-20
      • 2014-02-09
      相关资源
      最近更新 更多