2017-12-05 3 views
10

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!

+0

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

+0

Ja, danke für die Aufklärung! –

+2

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

Antwort

5

Gelöst! Es war ausreichend, um den Kotlin Kompilation dir auf das gleiche Verzeichnis wie Java zu setzen:

compileKotlin.destinationDir = compileJava.destinationDir 

Es funktioniert jetzt sowohl mit den Quellen im gleichen Baum oder in verschiedenen Bäumen; aber mit einer Eigenart: Die Task jar erzeugt ein Jar mit allen doppelten Einträgen. Ich werde daran arbeiten, das nächste zu beheben.

Danke an alle!

+1

Fertig, mit einem einfachen 'jar {duplicatesStrategy =" exclude "}' –

Verwandte Themen