Mixto Kotlin + Java con Maven, reference no resuelta

Tengo un proyecto de Maven con el código de Kotlin hello.kt que llama al código de Java JavaFoo.java que llama al código de Kotlin KotlinFoo.kt . hello.kt también llama a KotlinFoo.kt directamente. Estoy intentando build esto con mvn clean install usando exactamente la configuration de Maven descrita en los documentos Maven de kotlinlang .

Si hello.kt no llama a JavaFoo (pero dejo JavaFoo en el proyecto), esta compilation funciona perfectamente.

Los documentos dicen que el comstackdor de Kotlin debe invocarse antes del comstackdor de Java, lo que me sugiere que todo el código de Kotlin debe comstackrse antes que cualquier código de Java, es decir, con esta configuration puede llamar a Kotlin desde Java pero no al revés. Sin embargo, los documentos describen esta configuration solo como "aplicaciones de código mixto", no como "llamadas a Kotlin desde Java".

En otras palabras, esta falla parece ser consistente con lo que los documentos parecen implicar, pero no con lo que dicen directamente, o simplemente estoy malinterpretando algo.

Quiero llamar a cada idioma desde el otro. ¿Hay alguna configuration de Maven que haga esto, por favor?

(Miré varias preguntas de StackExchange sobre configuraciones mixtas de código y ninguna de las soluciones me funciona).

Agregar el código solicitado: pom.xml:

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example.kotlindemo</groupId> <artifactId>kotlin-demo</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>kotlin-demo</name> <properties> <kotlin.version>1.1.2-2</kotlin.version> <kotlin.compiler.incremental>true</kotlin.compiler.incremental> <main.class>com.example.kotlindemo.HelloKt</main.class> </properties> <dependencies> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib</artifactId> <version>${kotlin.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>kotlin-maven-plugin</artifactId> <groupId>org.jetbrains.kotlin</groupId> <version>${kotlin.version}</version> <executions> <execution> <id>compile</id> <phase>process-sources</phase> <goals> <goal>compile</goal> </goals> <configuration> <sourceDirs> <sourceDir>${project.basedir}/src/main/kotlin</sourceDir> <sourceDir>${project.basedir}/src/main/java</sourceDir> </sourceDirs> </configuration> </execution> <execution> <id>test-compile</id> <goals> <goal>test-compile</goal> </goals> <configuration> <sourceDirs> <sourceDir>${project.basedir}/src/test/kotlin</sourceDir> <sourceDir>${project.basedir}/src/test/java</sourceDir> </sourceDirs> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <executions> <!-- Replacing default-compile as it is treated specially by maven --> <execution> <id>default-compile</id> <phase>none</phase> </execution> <!-- Replacing default-testCompile as it is treated specially by maven --> <execution> <id>default-testCompile</id> <phase>none</phase> </execution> <execution> <id>java-compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> </execution> <execution> <id>java-test-compile</id> <phase>test-compile</phase> <goals> <goal>testCompile</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.6</version> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <archive> <manifest> <mainClass>${main.class}</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </execution> </executions> </plugin> </plugins> </build> </project> 

src/main/kotlin/hello.kt :

 package com.example.kotlindemo fun main(args : Array<String>) { println("Hello, world!") var kfoo = KotlinFoo() kfoo.printFooString() kfoo.fooString = "init2" kfoo.printFooString() var foo2 = JavaFoo("abcd") foo2.printString() } 

src/main/kotlin/KotlinFoo.kt :

 package com.example.kotlindemo class KotlinFoo { var fooString = "init" fun printFooString() { println(this.fooString) } } 

src/main/java/JavaFoo.java :

 package com.example.kotlindemo; class JavaFoo { private KotlinFoo k; JavaFoo(String initializer) { k = new KotlinFoo(); k.setFooString(initializer); } void printString() { this.k.printFooString(); } } 

Error:

 [ERROR] .../src/main/kotlin/hello.kt: (12, 14) Unresolved reference: JavaFoo 

La compilation falla porque su class Java no está en un directory que coincida con su statement de package. Si bien Kotlin le permite colocar classs en cualquier directory, independientemente del package en el que se encuentren, Java requiere que coloque cada file en un package que corresponda a su directory. Este requisito también se aplica a proyectos de idiomas mixtos.

Para solucionar el error, mueva JavaFoo.java a src/main/java/com/example/kotlindemo .

  • ¿Cómo se comstack el proyecto Java + Kotlin con Maven?
  • Escribir JSP en kotlin con maven - Error instanciando la class de servlet, ClassNotFoundException
  • Dependencia de Maven utilizando Kotlin no trayendo classs de Kotlin
  • cómo especificar el order de plugin de comstackdor maven
  • Travis CI: Maven no consigue la dependencia de Kotlin 1.1.1 en Linux
  • Montaje de Kotlin + Maven: sin atributo de manifiesto principal
  • Kotlin - Maven no está realizando testings
  • Kotlin: no puedo correr "hola mundo" en intellij
  • ¿Por qué esta aplicación Spring Boot no puede encontrar la página principal?
  • Kotlin Kapt: java.lang.IllegalStateException: endPosTable ya está configurado
  • Quiero agregar mi versión de kotlin al proyecto Gradel