Ich bin ziemlich neu bei Gradle (und Java 9, um ehrlich zu sein), und ich versuche Gradle zu verwenden, um ein einfaches Bibliotheksprojekt zu erstellen, das eine Mischung aus Java 9 ist und Kotlin. Im Detail gibt es eine Schnittstelle in Java und eine Implementierung in Kotlin; Ich würde alles in Kotlin machen, aber die modules-info.java
ist sowieso Java, also habe ich beschlossen, die Dinge so zu machen.Ein Kotlin + Java 9-Projekt mit Gradle erstellen
Ich bin auf IntelliJ Idee, mit dem 1.2.0 kotlin plugin und gradle 4.3.1 extern definiert.
Dateisystem-Schema ist:
+ src
+ main
+ java
+ some.package
- Roundabout.java [an interface]
- module-info.java
+ kotlin
+ some.package.impl
- RoundaboutImpl.kt [implementing the interface]
module-info.java
ist:
module some.package {
requires kotlin.stdlib;
exports some.package;
}
und build.gradle
ist:
buildscript {
ext.kotlin_version = '1.2.0'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
group 'some.package'
version '1.0-PRE_ALPHA'
apply plugin: 'java-library'
apply plugin: 'kotlin'
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
sourceCompatibility = 9
compileJava {
dependsOn(':compileKotlin')
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
]
classpath = files()
}
}
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib', version: "$kotlin_version"
testCompile group: 'junit', name: 'junit', version: '4.12'
}
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
Beachten Sie, dass ich ein Modulpfad auf der Java-Kompilierung Aufgabe angeben musste oder die Kompilierung schlägt fehl mit:
error: module not found: kotlin.stdlib requires kotlin.stdlib;
Wie auch immer, jetzt dieser Build mit diesem Fehler fehlschlägt, und ich kann nicht herausfinden, wie es zu lösen:
error: package some.package.impl does not exist
import some.package.impl.RoundaboutImpl;
error: cannot find symbol
return new RoundaboutImpl<>(queueSize, parallelism, worker, threadPool);
ich denke , dass der Kotlin Teil der Zusammenstellung ok geht, dann scheitert der Java-Teil, weil er die Kotlin-Seite sozusagen nicht "sieht".
Ich denke, ich sollte es irgendwie sagen, um die bereits kompilierten Kotlin-Klassen im Klassenpfad zu laden; aber (zuerst) wie mache ich das in Großbuchstaben? und (zweite) ist es sogar möglich? Ich denke, dass Sie Modulpfad und Klassenpfad in Java 9 nicht mischen können.
Wie kann ich das lösen? Ich denke, es ist eine ziemlich gewöhnliche Situation, da jedes Modul im Java9-Stil ein Modul mit mehreren Sprachen sein wird (wegen module-info.java
), also denke ich, dass ich etwas wirklich Grundlegendes vermisse.
Vielen Dank im Voraus!
um pedantisch zu sein, 'module-info.java' ist nicht _really_ Java, es ist ein spezielles DSL, ABER die Kotlin-Entwickler haben gesagt, sie [sehen keinen Wert darin, es neu zu erfinden] (https://discuss.kotlinlang.org/ t/kotlin-support-for-java-9-modul-system/2499) so bleibt es so wie es ist. – Moira
Ja, danke für die Aufklärung! –
Was ist, wenn Sie sowohl die Schnittstelle als auch das Impl entweder in Java oder in Kotlin behalten? Kompiliert es dann? Warum kompilieren Sie Kotlin mit JVM 1.8? – nullpointer