Cómo usar kapt desde la línea de command (con kotlinc)?

La documentation oficial indica cómo usar kapt de Gradle y Maven. Pero, ¿cómo puedo usar kapt desde la command-line, con kotlinc ?

Agregue tools.jar al tools.jar de Kotlin comstackdores

A partir de la versión 1.1.3-2 de Kotlin, kotlinc no agrega tools.jar al classpath del comstackdor. tools.jar es requerido por kapt .

Como solución alternativa, puede parchear kotlinc .

 vim $KOTLIN_HOME/bin/kotlinc 

Edite la línea 79.

De:

 kotlin_app=("${KOTLIN_HOME}/lib/kotlin-preloader.jar" "org.jetbrains.kotlin.preloading.Preloader" "-cp" "${KOTLIN_HOME}/lib/kotlin-compiler.jar" $KOTLIN_COMPILER) 

A:

 kotlin_app=("${KOTLIN_HOME}/lib/kotlin-preloader.jar" "org.jetbrains.kotlin.preloading.Preloader" "-cp" "${KOTLIN_HOME}/lib/kotlin-compiler.jar:$JAVA_HOME/lib/tools.jar" $KOTLIN_COMPILER) 

Nota: $JAVA_HOME debe apuntar a JDK, no a JRE.

Nota: Este es un truco.

Invocar kotlinc con arguments correctos

 kotlinc -cp $MY_CLASSPATH \ -Xplugin=$KOTLIN_HOME/lib/kotlin-annotation-processing.jar -P \ plugin:org.jetbrains.kotlin.kapt3:aptMode=aptAndStubs,\ plugin:org.jetbrains.kotlin.kapt3:apclasspath=/path/to/SomeAnnotationProcessor.jar,\ plugin:org.jetbrains.kotlin.kapt3:sources=./sources,\ plugin:org.jetbrains.kotlin.kapt3:classes=./classes,\ plugin:org.jetbrains.kotlin.kapt3:stubs=./stubs \ /path/to/MyKotlinFile.kt 

Reemplazar:

  • $MY_CLASSPATH con su classpath deseado
  • /path/to/SomeAnnotationProcessor.jar con la ruta real a algún procesador de anotación
  • ./sources , ./classes y ./stubs con routes hacen directorys donde se almacenan los artefactos intermedios respectivos
  • /path/to/MyKotlinFile.kt con ruta a los files de Kotlin que desea comstackr
  • (opcionalmente) $KOTLIN_HOME con la ruta al directory de installation de Kotlin (ya debe tener esto en su env)

Nota: los arguments -X ( opciones avanzadas ) no son estándar y pueden cambiarse o eliminarse sin previo aviso.

Nota: la interfaz de kapt no está documentada. Puede verificar el código fuente: https://github.com/JetBrains/kotlin/blob/master/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt#L295


Este material se diseñó de forma inversa a partir de la ejecución de gradle build --debug en kotlin-examples/gradle/kotlin-dagger ( https://github.com/JetBrains/kotlin-examples/tree/master/gradle/kotlin-dagger ).

Esto es sólo un punto de partida. Todavía no estoy seguro de algunas cosas. Siéntase libre de editar esta respuesta.

Gracias a runningcode : https://github.com/facebook/buck/issues/956#issuecomment-309080611

Si no fue obvio: esto es una mierda. JetBrains simplemente asumió que la CLI no importa y establecieron las interfaces cruciales no documentadas / reservadas para uso interno.