使用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不存在

import some.package.impl.RoundaboutImpl;

错误:找不到符号

返回new 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脚本,我将module-info.java放在src / module下。 它自动包含在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来查看当前使用的版本。