我正在尝试将一些 Kotlin 类添加到我在 Vaadin Framework (v 8.4.5) 下的现有 Java 项目中。
我已完整阅读 how to mixing java and Kotlin 上的教程,并且我已经在我现有的 Java 项目中成功创建了一个 Kotlin 类。
新的 Kotlin 类在我的项目中(当然,为了隐私我已经删除了所有代码)
package it.projectName.utils
import it.projectName.otherClasses
class SecurityUtils (user: User) {
//various val and var, and of course the isCrypted calculated val
init {
if(!isCrypted){
//encrypt user password
}
}
}
现在我在我的 Java 类中使用这个 Kotlin 类
import it.projectName.utils.SecurityUtils;
public class UserDao{
//[... other code ...]
SecurityUtils securityUtils = new SecurityUtils(user);
}
一切正常,我没有收到任何编译器错误。
但是当我尝试使用带有 jetty:run
的 maven 运行我的项目时,它会抛出一个错误:
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /C:/pathToClass/UserDao.java:[9,36] cannot find symbol
symbol: class SecurityUtils
location: package it.projectName.utils
[INFO] 1 error
[INFO] -------------------------------------------------------------
他指的是 import it.projectName.utils.SecurityUtils;
我已经检查了我的 pom.xml
,一切看起来都很好:
<properties>
<kotlin.version>1.2.61</kotlin.version>
<kotlin.compiler.incremental>true</kotlin.compiler.incremental>
</properties>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test</artifactId>
<version>${kotlin.version}</version>
<scope>test</scope>
</dependency>
<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>
<sourceDir>src/main/java</sourceDir>
<sourceDir>src/main/kotlin</sourceDir>
</sourceDirs>
</configuration>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
<configuration>
<sourceDirs>
<sourceDir>src/main/java</sourceDir>
<sourceDir>src/main/kotlin</sourceDir>
</sourceDirs>
</configuration>
</execution>
</executions>
<configuration>
<jvmTarget>1.8</jvmTarget>
</configuration>
</plugin>
我错过了什么? 谢谢
最佳答案
我们必须在 src/main
目录下为每个使用两个不同的源目录。 (我说的是 Maven 文件夹结构)。
例如,对于 Java,它是 src/main/java
,对于 Kotlin,它就像是 src/main/kotlin
。
根据文档 here ,在编译 Kotlin 和 Java 源代码 主题下,JetBrains 提供了全面的 maven 插件来将上述每个目录声明为其对应的源目录。这样编译器就可以检测到这两个源目录,并且在构建过程中,能够将各自的二进制文件复制到类路径中。
这是 maven 插件声明,
<build>
<plugins>
<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>
<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>
</plugins>
此外,我个人建议必须有以下属性以提高构建过程的速度。
<properties>
<kotlin.compiler.incremental>true</kotlin.compiler.incremental>
</properties>
即使您使用模块创建 maven 项目,这个对我来说也很有效。
关于java - 将 Java 和 Kotlin 与 Maven 混合,找不到符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52111469/