如何将扩展函数打包到库 jar 中?
How do I package extension functions in a library jar?
我有一组扩展函数,我想打包成一个 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
}
}
我需要做什么才能使扩展功能可见?
愚蠢的错误,扩展函数是可见的,它们只需要在它们作为扩展的对象的上下文中调用。在本例中,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()
}
我有一组扩展函数,我想打包成一个 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
}
}
我需要做什么才能使扩展功能可见?
愚蠢的错误,扩展函数是可见的,它们只需要在它们作为扩展的对象的上下文中调用。在本例中,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()
}