2017-12-05 127 views
10

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ę!

+0

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

+0

Tak, dziękuję za wyjaśnienia! –

+2

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

Odpowiedz

5

Rozwiązany! To był wystarczający, aby ustawić Kotlin kompilacji dir do tego samego katalogu co Java:

compileKotlin.destinationDir = compileJava.destinationDir 

Działa teraz, zarówno ze źródeł w tym samym drzewie lub w różnych drzew; ale z dziwactwem: zadanie jar tworzy słoik ze zduplikowanymi wszystkimi wpisami. W następnej kolejności zajmę się naprawą tego.

Dziękuję wszystkim!

+1

Zrobione, z prostym 'jar {duplicatesStrategy =" exclude "}' –

Powiązane problemy