在 Gradle 项目中混合 Java 和 Kotlin,Kotlin 找不到 Java 类

问题描述 投票:0回答:4

正如标题所说,我正在尝试将 Java 和 Kotlin 混合在一个项目中。这里有一个很好的例子。 mixed-java-kotlin-hello-world。除了 kotlin 无法找到在 src/main/java/somepackage/SomeClass.java 中找到的任何 Java 类之外,一切都正常工作

这是什么原因造成的?

这是我收到的错误。

当我尝试编辑我的 build.gradle 时,它显示我没有正确拼写 kotlin,并在插件上给我错误,但我是从 kotlins 网站复制和粘贴的。

我的 build.gradle 看起来像这样

group 'Battle-OS'
version '1.0-SNAPSHOT'

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.2-1"
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'kotlin'

repositories {
    mavenCentral()
}

dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:1.0.2-1"
testCompile  'junit:junit:4.11'
testCompile "org.jetbrains.kotlin:kotlin-test-junit:1.0.2-1"

compile 'org.slf4j:slf4j-api:1.7.18'
testCompile 'junit:junit:4.12'

    // https://mvnrepository.com/artifact/com.google.code.gson/gson
compile group: 'com.google.code.gson', name: 'gson', version: '2.7'

// https://mvnrepository.com/artifact/com.google.guava/guava
compile group: 'com.google.guava', name: 'guava', version: '19.0'

// https://mvnrepository.com/artifact/io.netty/netty-all
compile group: 'io.netty', name: 'netty-all', version: '4.0.37.Final'

// https://mvnrepository.com/artifact/com.moandjiezana.toml/toml4j
compile group: 'com.moandjiezana.toml', name: 'toml4j', version: '0.6.0'

// https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-stdlib
compile group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib', version: '1.0.2-1'

}

而不是开始尝试在更大的项目上进行这项工作。我尝试通过创建一个新的 gradle 项目来完成这项工作。我创建了一个测试 java 类,其中包含打印 hello world 的方法。然后我创建了一个测试 kotlin 类,它创建了 java 类的新对象,并调用 java 类中的方法来打印 hello world。

这解决了我上面遇到的问题,现在我可以从 kotlin 调用 java 类,也可以从 java 调用 kotlin,但现在运行它时会出现错误。

Exception in thread "main" java.lang.NoClassDefFoundError:      kotlin/jvm/internal/Intrinsics
at AKotlinClassKt.main(AKotlinClass.kt)
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
java gradle kotlin
4个回答
22
投票

你应该像这样覆盖源集

sourceSets {
    main.java.srcDirs = []
    main.kotlin.srcDirs = ['src/main/java', 'src/main/kotlin']
    main.resources.srcDirs = ['src/main/resources']
}

10
投票

我遇到了类似的问题,我的 java 代码与 kotlin 代码位于同一源目录中

我的解决方案是在

build.gradle.kts
中添加此配置:

configure<SourceSetContainer> {
    named("main") {
        java.srcDir("src/main/kotlin")
    }
}

0
投票

如果有人使用 Android Gradle 插件偶然发现此线程;

android {
    sourceSets {
        named("main") {
            java.srcDir("src/main/kotlin")
        }
    }
}

0
投票

将你的java源代码放入像这样的包中将与Thami的答案具有相同的效果。

© www.soinside.com 2019 - 2024. All rights reserved.