我有一个关于 kotlin-maven 插件的问题:编译顺序是如何确定的?我的意思是:Kotlin 编译器必须排在第一位吗?它懂Java代码吗?java编译器不理解kotlin代码,所以我想它会检查字节码,但为此,kotlin的字节码必须存在,所以必须有人确定kotline编译器必须在javac之前编译其代码。
示例:我有依赖于 Kotlin B 类的 java 类,B 类也依赖于 A。
我是否必须在 maven 插件中手动执行某些操作,方法是在 java maven 编译器之前声明它?
Kotlin 编译器可以解析 Java 源代码,因此您可以在 Kotlin 代码中引用 Java 类,即使这些类尚未编译。
在 Kotlin 编译器编译了 kotlin 代码之后,Java 编译器可以编译那些将编译的 kotlin 类作为依赖项的 Java 类。
所以,回答你的问题,是的 — Kotlin 编译器插件必须在混合 Kotlin 和 java 源代码的项目中的 java 编译器插件之前执行。这是通过在构建的早期阶段(即 process-sources
)调度执行来实现的。
以下是混合 Kotlin-Java maven 模块的 kotlin maven 插件配置示例:
<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>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
为了编译同时包含 Kotlin 和 Java 代码的项目,您必须确保 Kotlin 编译器在 Java 编译器之前运行。我按照官方 Kotlin 文档中的描述配置了编译插件,它就像一个魅力:
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<groupId>org.apache.maven.plugins</groupId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
<executions>
<execution>
<id>default-compile</id>
<phase>none</phase>
</execution>
<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>