Jestem całkiem nowy w Gradle (i uczciwie w Jawie 9) i próbuję użyć Gradle do zbudowania prostego projektu biblioteki, który jest połączeniem środowiska Java 9 i Kotlin. Bardziej szczegółowo, istnieje interfejs w Javie i implementacja w Kotlin; Zrobiłbym wszystko w Kotlin, ale modules-info.java
i tak jest java, więc postanowiłem robić rzeczy w ten sposób.Budowanie projektu Kotlin + Java 9 z Gradle
Korzystam z IntelliJ Idea, z wtyczką kotlin 1.2.0 i gradem 4.3.1 zdefiniowanymi zewnętrznie.
schemat systemu plików to:
+ src
+ main
+ java
+ some.package
- Roundabout.java [an interface]
- module-info.java
+ kotlin
+ some.package.impl
- RoundaboutImpl.kt [implementing the interface]
module-info.java
jest:
module some.package {
requires kotlin.stdlib;
exports some.package;
}
i build.gradle
jest:
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"
}
Zauważ, że musiałem podać ścieżkę modułu na zadania java kompilacji lub kompilacja kończy się niepowodzeniem:
error: module not found: kotlin.stdlib requires kotlin.stdlib;
W każdym razie, teraz ten build nie powiedzie się z tego błędu i nie mogę dowiedzieć się, jak go rozwiązać:
error: package some.package.impl does not exist
import some.package.impl.RoundaboutImpl;
error: cannot find symbol
return new RoundaboutImpl<>(queueSize, parallelism, worker, threadPool);
myślę że Kotlin część kompilacji będzie ok, następnie część java zawiedzie, ponieważ nie "widzi" strony kotlin, że tak powiem.
Myślę, że powinienem jakoś nakazać załadowanie już skompilowanych klas kotlin w ścieżce klas; ale (po pierwsze) jak mam to zrobić w gradle? i (drugi) czy to możliwe?? Myślę, że nie można łączyć ścieżek modułów i ścieżek klas w języku Java 9.
Jak mogę to rozwiązać? Myślę, że to dość powszechna sytuacja, ponieważ każdy moduł w stylu java9 będzie modułem mieszanym (z powodu module-info.java
), więc myślę, że brakuje tu czegoś naprawdę podstawowego.
Z góry dziękuję!
być pedantycznym, 'module-info.java' nie jest _zapewnia_ Java, jest to specjalny DSL, ALE twórcy Kotlin powiedzieli, że [nie widzą żadnej wartości w wymyślaniu ich na nowo] (https://discuss.kotlinlang.org/ t/kotlin-support-for-java-9-module-system/2499), więc pozostanie tak jak jest. – Moira
Tak, dziękuję za wyjaśnienia! –
Co zrobić, jeśli zachowujesz interfejs i impl w Java lub Kotlin. Czy to się wtedy kompiluje? Dlaczego miałbyś kompilowaćKotlin używając JVM 1.8? – nullpointer