web-dev-qa-db-ja.com

Kotlin + Java 9プロジェクトをGradleでビルドする

私はGradle(およびJava 9)にかなり慣れていません。Gradleを使用してJava 9とKotlin。詳しくは、JavaとKotlinの実装にインターフェイスがあります。Kotlinですべてを行いますが、modules-info.JavaはJavaとにかく、この方法で処理することにしました。

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は:

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

Javaコンパイルタスクでモジュールパスを指定する必要がありました。そうでない場合、コンパイルは次のエラーで失敗します。

エラー:モジュールが見つかりません:kotlin.stdlibにはkotlin.stdlibが必要です。

とにかく、今、このビルドはこのエラーで失敗し、解決方法がわかりません。

エラー:パッケージsome.package.implが存在しません

some.package.impl.RoundaboutImpl;をインポートします。

エラー:シンボルが見つかりません

新しいRoundaboutImpl <>(queueSize、parallelism、worker、threadPool);

I thinkコンパイルのKotlin部分は大丈夫だと思います。Java部分は、いわばKotlin側を「認識」しないため失敗します。

クラスパスにコンパイル済みのkotlinクラスをロードするように指示する必要があると思います。しかし、(最初に)これをgradleでどうやって行うのですか?および(2番目)それは可能ですか? Java 9.では、モジュールパスとクラスパスを混在させることはできないと思います。

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

前もって感謝します!

17
Germano Rizzo

解決しました! kotlinコンパイルディレクトリをJavaと同じディレクトリに設定するだけで十分です。

compileKotlin.destinationDir = compileJava.destinationDir

現在、同じツリーまたは異なるツリーのソースの両方で機能します。しかし、癖があります:jarタスクは、すべてのエントリが複製されたjarを生成します。次はこれを修正します。

皆に感謝します!

11
Germano Rizzo

Module-info.Javaをsrc/moduleの下に配置する次のGradleスクリプトを使用しています。自動的にjarに含まれます(重複なし):

if (JavaVersion.current() >= JavaVersion.VERSION_1_9) {
    subprojects {
        def srcModule = "src/module"
        def moduleInfo = file("${project.projectDir}/$srcModule/module-info.Java")
        if (moduleInfo.exists()) {

            sourceSets {
                module {
                    Java {
                        srcDirs = [srcModule]
                        compileClasspath = main.compileClasspath
                        sourceCompatibility = '9'
                        targetCompatibility = '9'
                    }
                }
                main {
                    kotlin { srcDirs += [srcModule] }
                }
            }

            compileModuleJava.configure {
                dependsOn compileKotlin
                destinationDir = compileKotlin.destinationDir
                doFirst {
                    options.compilerArgs = ['--module-path', classpath.asPath,]
                    classpath = files()
                }
            }
            jar.dependsOn compileModuleJava
        }
    }
}

今後は更新しません。 https://github.com/robstoll/atrium/blob/master/build.gradle を見て、現在使用中のバージョンを確認してください。

2
Robert Stoll

受け入れられた回答は私にはうまくいきませんでした(少なくともそれが提示された方法ではありませんでした)が、これはうまくいきました:

plugins {
    id "org.jetbrains.kotlin.jvm" version "1.3.50"
}

compileKotlin {
    doFirst {
        destinationDir = compileJava.destinationDir
    }
}

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

受け入れられた答えが示唆する方法でそれを行うと、このエラーが発生しました:

プロパティ 'compileKotlinOutputClasses'に指定されたディレクトリ '/ path/to/project/build/classes/kotlin/main'は存在しません。


Gradleバージョン:5.6

0
smac89