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

标签 java maven intellij-idea kotlin vaadin

我正在尝试将一些 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/

相关文章:

java - 将十六进制+字符转换为字符

java - 将位转换为 double 后,如何在不使用 BigDecimal 的情况下存储实际的浮点/ double 值?

java - 从 spring-boot-starter-web 中排除 Logback 依赖项会阻止 log4j 系统正确初始化

java - 智能理念 | xml验证错误

java - 如何在DSL中访问Java的实例变量?

java.sql.SQLException : ORA-01704: string literal too long When Insert Or Update

java - 为什么 JRebel 配置应该包含在我的 war 中?

maven - JBAS015893:遇到无效的类名

intellij-idea - 翻译属性中的 IntelliJ IDEA 'wrong attribute value' 警告

java - 重构 JSP 中的 EL 表达式