使用Gradle构建Kotlin + Java 9项目
我对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);
我 认为 编译的Kotlin部分可以正常进行,然后java部分失败,因为可以这样说,因为它没有“看到” kotlin方面。
我想我应该告诉它如何在类路径中加载已经编译的kotlin类。但是(第一)如何在gradle中做到这一点?(第二) 甚至有可能 吗?我认为您不能在Java
9中混合使用模块路径和类路径。
我该如何解决?我认为这是一种非常普遍的情况,因为每个java9样式的模块都将是一个混合语言模块(由于module-
info.java),因此我认为这里缺少一些非常基本的东西。
提前致谢!
回答:
解决了!将kotlin编译目录设置为与Java相同的目录就足够了:
compileKotlin.destinationDir = compileJava.destinationDir
现在,无论是同一棵树还是不同树中的源,它都可以工作。但有一个怪癖:该jar
任务生成一个jar,其中所有条目均重复。接下来,我将解决此问题。
谢谢大家!
以上是 使用Gradle构建Kotlin + Java 9项目 的全部内容, 来源链接: utcz.com/qa/416062.html