将 Java 和 Kotlin 与 Maven 混合,找不到符号

Mixing Java and Kotlin with Maven, can't find symbol

我正在尝试将一些 Kotlin classes 添加到我在 Vaadin Framework (v 8.4.5) 下的现有 Java 项目中。

我已完整阅读 how to mixing java and Kotlin 上的教程,并且已在我现有的 Java 项目中成功创建了一个 Kotlin class。

新的 Kotlin class 在我的项目中(ofc 为了隐私我已经删除了所有代码)

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 class 和

中使用这个 Kotlin class
import it.projectName.utils.SecurityUtils;
public class UserDao{
    //[... other code ...]
    SecurityUtils securityUtils = new SecurityUtils(user);
}

一切正常,我没有收到任何编译器错误。 但是当我尝试 运行 我的项目与 Maven 和 jetty:run 时,它会抛出一个错误:

[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,在 Compiling Kotlin and Java sources 主题下,JetBrains 提供了全面的 maven 插件来将上述每个目录声明为它们对应的源码目录。这样编译器就可以检测到这两个源目录,并且在构建过程中,能够将各自的二进制文件复制到 class 路径。

这是 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 项目。