如何使用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!\"." } }
DummyService
和Consts
类是与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>