如何使用Maven编译Java + Kotlin项目?

我试图编译有Kotlin类引用Java类的Maven项目。 这是我父母POM的一部分:

... <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib</artifactId> <version>${kotlin.version}</version> </dependency> ... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${compiler-plugin-version}</version> <configuration> <source>${java-version}</source> <target>${java-version}</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> <plugin> <artifactId>kotlin-maven-plugin</artifactId> <groupId>org.jetbrains.kotlin</groupId> <version>${kotlin.plugin.version}</version> <executions> <execution> <id>compile</id> <phase>process-sources</phase> <goals> <goal>compile</goal> </goals> </execution> <execution> <id>test-compile</id> <phase>process-test-sources</phase> <goals> <goal>test-compile</goal> </goals> </execution> </executions> <configuration> <scanForAnnotations>false</scanForAnnotations> </configuration> </plugin> 

和POM的相关部分:

 <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib</artifactId> </dependency> ... <plugin> <artifactId>kotlin-maven-plugin</artifactId> <groupId>org.jetbrains.kotlin</groupId> <configuration> <sourceDirs> <source>${project.basedir}/src/main/kotlin</source> </sourceDirs> </configuration> </plugin> 

和Kotlin课堂:

 Stateless open class DummyServiceImpl : DummyService { PersistenceContext(unitName = Consts.UNIT_NAME) private val em: EntityManager? = null override fun get(id: Long?): Dummy { return em!!.find<Dummy>(javaClass<Dummy>(), id) } override fun sayHi(): String { return "Dummy service says \"Hi!\"." } } 

DummyServiceConsts类是与DummyServiceImpl驻留在相同模块中的Java类。 所以当我用Maven编译包含DummyServiceImpl的模块时,它是这样的:

 [error] C:\somepath\service\DummyServiceImpl.kt: (14, 31) Unresolved reference: DummyService [error] C:\somepath\service\DummyServiceImpl.kt: (16, 35) Unresolved reference: Consts 

如果我切换Kotlin插件执行phase进行compile那么如果有从Java到Kotlin类的引用,则可预测性会失败:

 [ERROR] /C:/somepath/service/impl/DummyServiceClientImpl.java:[5,27] cannot find symbol [ERROR] symbol: class DummyServiceImpl 

那么,这个怎么办呢? 请注意,用IDEA make建筑物完好无损。

确保你在你的pom.xml的<build>中有这个声明

  <plugins> <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>${kotlin.version}</version> <executions> <execution> <id>compile</id> <phase>process-sources</phase> <goals> <goal>compile</goal> </goals> <configuration> <sourceDirs> <source>src/main/java</source> <source>src/main/kotlin</source> <source>src/main/resources</source> </sourceDirs> </configuration> </execution> <execution> <id>test-compile</id> <phase>process-test-sources</phase> <goals> <goal>test-compile</goal> </goals> <configuration> <sourceDirs> <source>src/test/java</source> <source>src/test/kotlin</source> <source>src/test/resources</source> </sourceDirs> </configuration> </execution> </executions> </plugin> </plugins> 

确保配置中提到的所有文件夹 (在src / test中是src / main和3x中的3x) 实际上都存在,即使它们不包含任何类/资源。 一旦它适用于您,您仍然可以微调配置。

还要注意使用与上面提到的完全相同的顺序,让编译器先编译Java代码。

我结束了使用以下配置来混合Java和Kotlin源代码:

 <build> <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory> <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory> <plugins> <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>${kotlin.version}</version> <executions> <execution> <id>compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> <configuration> <sourceDirs> <source>src/main/kotlin</source> </sourceDirs> </configuration> </execution> <execution> <id>test-compile</id> <phase>test-compile</phase> <goals> <goal>test-compile</goal> </goals> <configuration> <sourceDirs> <source>src/test/kotlin</source> </sourceDirs> </configuration> </execution> </executions> </plugin> </plugins> </build>