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 .

  • Android Despliegue las fonts de kotlin a un repository de maven
  • ¿Cómo actualizo kotlin-js-library a 1.1.3 como ha sido el plugin de kotlin-gradle?
  • ¿Cómo hago la compilation de post-compilation en Maven?
  • No se puede conseguir que las classs de Kotlin en el proyecto Java maven funcionen (Eclipse)
  • Maven-publish gradle plugin se salta la versión
  • Sistema local de administración de packages Java en Python PIP style?
  • ¿Puede JRebel volver a cargar las classs de Kotlin cuando son utilizadas por el plugin kotlin-maven-plugin en maven?
  • Montaje de Kotlin + Maven: sin atributo de manifiesto principal