2017-12-05 14 views
10

Gradle(とJava 9、正直言って)はかなり新しく、Gradleを使ってJava 9とKotlin。より詳細には、Javaにはインタフェースがあり、Kotlinには実装されています。私はKotlinですべてをやるが、とにかくmodules-info.javaはjavaなので、私はこのようにすることにした。GradleでKotlin + Java 9プロジェクトを構築する

私はIntelliJ Ideaをビルドしています.1.2.0のkotlinプラグインとgradle 4.3.1が外部で定義されています。

ファイルシステムのスキーマは次のとおりです。

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

module-info.javaは次のとおりです。

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

build.gradleされています。私は、Javaのコンパイルタスクのモジュールパスを指定する必要がありました

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

お知らせコンパイルが失敗します:

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

とにかく、今、このビルドは、このエラーで失敗し、私はそれを解決する方法を見つけ出すことはできません。

error: package some.package.impl does not exist

import some.package.impl.RoundaboutImpl;

error: cannot find symbol

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

私は、コンパイルのKotlinの一部がOK起こっていると思い、 Javaの部分は失敗するので、Kotlinの側を「見る」ことはできません。

すでにコンパイルされたkotlinクラスをクラスパスにロードする方法を教えてください。しかし(最初に)私はどのようにこれをgradleで行うのですか? (第2)も可能です? Java 9ではモジュールパスとクラスパスを混在させることはできないと思います。

どうすればこの問題を解決できますか?すべてのjava9スタイルのモジュールは(module-info.javaのために)混合言語モジュールになるので、かなり一般的な状況だと思うので、ここでは基本的なものが欠けていると思います。

ありがとうございます!

+0

が賢明であるため、 'module-info.java'は特別なDSLではありませんが、Kotlinの開発者はこれを再発明することに価値がないと言っています(https://discuss.kotlinlang.org/ t/kotlin-support-for-java-9-module-system/2499)、それはそのままの状態です。 – Moira

+0

はい、明確化のおかげで! –

+2

インタフェースとインプリメントの両方をJavaまたはKotlinに保存するとどうなりますか?それはその後コンパイルされますか?また、JVM 1.8を使用してKotlinをコンパイルする理由は何ですか? – nullpointer

答えて

5

解決済み! Javaと同じディレクトリにkotlinコンパイルディレクトリを設定するのに十分であった:

compileKotlin.destinationDir = compileJava.destinationDir 

それは両方とも同じツリー内または異なるツリー内のソースで、動作するようになりました。奇妙なことに:jarタスクは、すべてのエントリが複製されたjarファイルを生成します。私はこれを解決するために、次に作業します。

ありがとうございました!

+1

完了しました。単純な 'jar {duplicatesStrategy =" exclude "}' –

関連する問題