La creación de Gradle falló con Kotlin, Scala y Java

Tengo un proyecto escrito en Java, Scala y Kotlin.

Pero cuando construyo este proyecto en Gradle, se produce un error con el post:

11:19:51: Executing task 'build'... :compileKotlin Using Kotlin incremental comstacktion e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (3, 19): Unresolved reference: Flag e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (10, 18): Unresolved reference: GroupMessageResponder e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (13, 2): 'doPost' overrides nothing e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (35, 23): Unresolved reference: Flag e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (38, 2): 'getHelpMessage' overrides nothing e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (40, 2): 'getKeyWordRegex' overrides nothing e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (42, 2): 'instance' overrides nothing :compileKotlin FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':compileKotlin'. > Comstacktion error. See log for more details * Try: Run with --stacktrace option to get the stack trace. Run with --info or -- debug option to get more log output. BUILD FAILED in 1s 1 actionable task: 1 executed Comstacktion error. See log for more details 11:19:53: Task execution finished 'build'. 

Esos errores tienen que ver con 'Referencia sin resolver', y esos 'reference' están escritos en Scala o Java.

Pero ejecutar este proyecto en IDEA funciona bien .

Pensé que esto fue causado por la compilation de Gradle Kotlin primero, que debería comstackrse en último lugar, por lo que esa 'reference' no se pudo encontrar.

Y este es mi build.gradle : build.gradle

ACTUALIZAR:

Una parte de la salida de gradle clean testClasses --info :

 ...SKIP... > Task :compileKotlin Using Kotlin incremental comstacktion e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (3, 19): Unresolved reference: Flag e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (11, 18): Unresolved reference: GroupMessageResponder ...SKIP.... > Task :compileKotlin [KOTLIN] deleting F:\Code\Project\Avalon\build\classes\kotlin\main on error [KOTLIN] deleting F:\Code\Project\Avalon\build\classes\kotlin\main on error :compileKotlin (Thread[Task worker Thread 3,5,main]) completed. Took 15.981 secs. FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':compileKotlin'. > Comstacktion error. See log for more details * Try: Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output. BUILD FAILED in 24s 2 actionable tasks: 2 executed Stopped 0 worker daemon(s). 

Salida completa publicada aquí .

El problema que tienes son los diferentes idiomas.

Algunos Kotlin y Java

Supongamos que solo tienes kotlin y java. De lo que puedes acceder desde ( -> significa que A accede a las classs de B)

 kotlin -> java java -> kotlin 

La razón por la que puede hacerlo es porque durante la compilation ( compileKotlin ) Kotlin se ocupa de este crossComstacktion / jointComstacktion / whatever-other-name entre esos dos idiomas.


Kotlin y Scala (una dirección)

Pero si tienes el caso:

 kotlin -> scala 

de lo que debe tener en count lo siguiente: cuando compileKotlin , comstack todos los files .java y .kt files de class , pero no en los files .scala (porque no sabe nada de scala ). Cuando accede ahora a las classs scala de kotlin , primero debe comstackr esas classs .scala , para asegurarse de que el process de compilation compileKotlin encuentre esos files .class para una compilation exitosa.

Puede definir que scala debe ejecutarse antes de kotlin por ejemplo

 compileKotlin.dependsOn compileScala 

Kotlin y Scala (ambas direcciones)

Muy bien hasta ahora, pero el problema es cuando tienes

 kotlin -> scala scala -> kotlin 

Porque este escenario no está funcionando.

Primero debe comstackr las classs de scala para comstackr correctamente las classs de kotlin (consulte la descripción anterior). Pero, por otro lado, necesita kotlin classs de kotlin para comstackr satisfactoriamente las classs scala . Eso es un problema.

La solución sería que uno de los idiomas permite la recostackción conjunta para todos los idiomas (pero esto nunca sucederá).

Entonces, para dos lenguajes JVM, donde ambos no son Java , debe decidir qué dirección de acceso está permitida. Pero no puedes permitir ambas direcciones de acceso.

En tales casos, a menudo ayuda poner la lógica en una class java y acceder a esta class java lugar de la class scala por ejemplo.

El problema también es el mismo para, por ejemplo, groovy , java y algún otro lenguaje jvm, como en el post https://discuss.gradle.org/t/kotlin-groovy-and-java-comstacktion/14903/10

  • Kotlin: llaves de varias expresiones (o declaraciones)
  • Comstackción manual de JAR para Scala & Kotlin
  • ¿Cómo funcionan las funciones de extensión de Kotlin?
  • Kotlin zipToda alternativa
  • @uncheckedVariance en Kotlin?
  • ¿Es posible express kotlin 'con' método equivalente en Scala?
  • ¿Por qué el comstackdor de Scala me da un error al pasar una class sellada de Kotlin a un constructor?
  • Kotlin VS Scala: Implementar methods con parameters constructor primarios
  • ¿Por qué Kotlin comstack más rápido que Scala?
  • ¿Existe un análogo Future.sequence en kotlin?
  • Clase de Json a Kotlin Data