我是使用kotlinpoet的新手,并且我一直在阅读文档,它看起来像一个很棒的库,但是我找不到解决我问题的示例。
我有一个依赖项lib-domain-0.1.jar
,其中有一些业务对象,例如:
package pe.com.business.domain
data class Person(val id: Int? = null, val name: String? = null)
...
..
package pe.com.business.domain
data class Departament(val id: Int? = null, val direction: String? = null)
...
..
.
我想建立一个名为lib-domain-fx-0-1.jar
的新依赖项,它具有相同的域,但是具有JavaFx属性(带有tornadofx):
package pe.com.business.domainfx
import tornadofx.*
class Person {
val idProperty = SimpleIntegerProperty()
var id by idProperty
val nameProperty = SimpleStringProperty()
var name by nameProperty
}
...
..
package pe.com.business.domainfx
import tornadofx.*
class Departament {
val idProperty = SimpleIntegerProperty()
var id by idProperty
val directionProperty = SimpleStringProperty()
var direction by directionProperty
}
...
..
.
我的问题是,如何仅通过gradle构建编译应用程序,如何在lib-domain-fx-0-1.jar
中生成这些文件?我的项目“ lib-domain-fx-0-1.jar”只是一个库,因此它没有主类,因此我不知道从哪里开始生成代码?我已经看到了几个示例,其中它们在同一项目中使用@Annotations
和两个不同的模块,但这不是我所需要的:(。我需要将lib-domain-0.1.jar
的所有类都转换为JavaFx版本, TornadoFX在另一个项目(lib-domain-fx-0.1.jar
)
感谢和问候。
答案 0 :(得分:2)
我认为 KotlinPoet 在其文档中缺少有关如何将其集成到项目中的任何示例。
正如@Egor所提到的,这个问题本身是很广泛的,因此我只回答核心部分:在使用Gradle构建应用程序时,如何使用 KotlinPoet 生成代码?
我是用custom Gradle tasks做的。
在 src / main / java / com / business / package / GenerateCode.kt 中的某个地方有一个应用程序/库/子项目:
package com.business.package
import com.squareup.kotlinpoet.*
fun main() {
// using kotlinpoet here
// in the end wrap everything into FileSpec
val kotlinFile: FileSpec = ...
// and output result to stdout
kotlinFile.writeTo(System.out)
}
现在,使Gradle创建具有产生的输出的文件。添加到 build.gradle :
task runGenerator(type: JavaExec) {
group = 'kotlinpoet'
classpath = sourceSets.main.runtimeClasspath
main = 'com.business.package.GenerateCodeKt'
// store the output instead of printing to the console:
standardOutput = new ByteArrayOutputStream()
// extension method genSource.output() can be used to obtain the output:
doLast {
ext.generated = standardOutput.toString()
}
}
task saveGeneratedSources(dependsOn: runRatioGenerator) {
group = 'kotlinpoet'
// use build directory
//def outputDir = new File("/${buildDir}/generated-sources")
// or add to existing source files
def outputDir = new File(sourceSets.main.java.srcDirs.first(), "com/business/package")
def outputFile = new File(outputDir, "Generated.kt")
doLast {
if(!outputDir.exists()) {
outputDir.mkdirs()
}
outputFile.text = tasks.runGenerator.generated
}
}
在Android Studio / Intellij IDEA中,打开Gradle tool window,找到新的组kotlinpoet
(没有group
的任务将在others
部分中),然后执行任务{ {1}}。