Grape

2017-12-05 91 views
10

ile bir Kotlin + Java 9 projesi oluşturma Gradle (ve dürüst olmak gerekirse Java 9) için oldukça yeni ve Java 9'un bir karışımı olan basit bir kütüphane projesi oluşturmak için Gradle'ı kullanmaya çalışıyorum ve Kotlin. Daha ayrıntılı olarak, Java'da bir arayüz ve Kotlin'de bir uygulama var; Her şeyi Kotlin'de yaparım, ama modules-info.java zaten java, bu yüzden işleri bu şekilde yapmaya karar verdim.Grape

IntelliJ Idea üzerinde, 1.2.0 kotlin eklentisi ve harici olarak tanımlanan 4.3.1 notu ile yapıyorum.

Dosya Sistemi şeması yer almaktadır:

+ src 
    + main 
    + java 
     + some.package 
     - Roundabout.java [an interface] 
     - module-info.java 
    + kotlin 
     + some.package.impl 
     - RoundaboutImpl.kt [implementing the interface] 

module-info.java geçerli:

module some.package { 
    requires kotlin.stdlib; 
    exports some.package; 
} 

ve build.gradle edilir: Ben java derleme görev üzerinde modül yolu belirtin zorunda

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" 
} 

Bildirimi veya derleme başarısız:

Neyse

error: module not found: kotlin.stdlib requires kotlin.stdlib;

, şimdi bu yapı bu hata ile başarısız olur ve bunu çözmek için nasıl bilemiyorum:

error: package some.package.impl does not exist

import some.package.impl.RoundaboutImpl;

error: cannot find symbol

return new RoundaboutImpl<>(queueSize, parallelism, worker, threadPool);

Ben derleme Kotlin kısmı Tamam gidiyor düşünüyorum , sonra java kısmı başarısız olur, çünkü konuşmak için kotlin tarafını "görmez".

Sanırım önceden derlenmiş kotlin sınıflarını sınıf yoluna yüklemek için bir şekilde söylemeliyim; ama (önce) bunu nasıl bir şekilde yapabilirim? ve (ikinci) mümkün mü? Java yolunda modül yolunu ve sınıf yolunu karıştıramazsınız.

Bunu nasıl çözebilirim? Her java9 tarzı modülün bir karışık dil modülü (module-info.java yüzünden) olacağı gibi oldukça yaygın bir durum olduğunu düşünüyorum, bu yüzden burada gerçekten basit bir şeyi kaçırdığımı düşünüyorum.

Şimdiden teşekkürler!

+0

pedantic olmak için, 'module-info.java' _really_ Java değil, özel bir DSL'tir, ama Kotlin devs, [bunu yeniden keşfetmedeki hiçbir değeri görmediklerini] söylemişlerdir (https://discuss.kotlinlang.org/ t/kotlin-destek-için-java-9-modül-sistem/2499) böylece olduğu gibi kalacaktır. – Moira

+0

Evet, açıklama için teşekkürler! –

+2

Hem arayüzü hem de Java ya da Kotlin'de ikna ederseniz ne olur? O zaman derler mi? Ayrıca, neden JVM 1.8 kullanarak Kotlin'i derlersiniz? – nullpointer

cevap

5

Çözüldü! Bu Java ile aynı dir KOTLIN derleme dir ayarlamak için yeterli oldu:

compileKotlin.destinationDir = compileJava.destinationDir 

O şimdi çalışıyor aynı ağaçta veya farklı ağaçlarda kaynaklarla hem; ama bir quirk ile: jar görevi, çoğaltılan tüm girdilere sahip bir jar üretir. Bunu düzeltmek için çalışacağım, sonra.

Herkese teşekkürler!

+1

Bitti, basit bir "jar {duplicatesStrategy =" exclude "}' ile –

İlgili konular