我对Gradle(和Java 9,老实说)还比较陌生,我试图使用Gradle构建一个简单的库项目,其中既包含Java 9元素,又包含Kotlin元素。具体来说,Java中有一个接口,在Kotlin中有相应的实现;我本可以完全用Kotlin实现,但是因为modules-info.java
必须使用Java,所以我选择了这种方式。
我正在使用IntelliJ Idea进行构建,使用1.2.0 kotlin插件和4.3.1 gradle在外部定义。
文件系统结构如下:
+ 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编译任务中指定模块路径,否则编译会失败并出现以下错误:
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部分没有问题,然后Java部分失败,因为它没有“看到”Kotlin的那一面,可以这么说。
我认为我应该以某种方式告诉它在类路径中加载已编译的Kotlin类;但是,(首先)我如何在Gradle中实现这一点? (第二)甚至可能吗?我认为您不能在Java 9中混合使用模块路径和类路径。
我该如何解决这个问题?我认为这是一个非常常见的情况,因为每个Java9风格的模块都将是混合语言模块(因为module-info.java
),所以我认为我在这里缺少了一些非常基本的东西。
提前致谢!
module-info.java
并不是真正的Java,而是一种特殊的DSL,但是Kotlin的开发人员已经表示他们认为重新发明它没有价值,所以它将保持不变。 - Salem