私は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
)、私はここで本当に基本的な何かが足りないと思います。
前もって感謝します!
解決しました! kotlinコンパイルディレクトリをJavaと同じディレクトリに設定するだけで十分です。
compileKotlin.destinationDir = compileJava.destinationDir
現在、同じツリーまたは異なるツリーのソースの両方で機能します。しかし、癖があります:jar
タスクは、すべてのエントリが複製されたjarを生成します。次はこれを修正します。
皆に感謝します!
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 を見て、現在使用中のバージョンを確認してください。
受け入れられた回答は私にはうまくいきませんでした(少なくともそれが提示された方法ではありませんでした)が、これはうまくいきました:
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