java - 使用 Gradle 构建 Kotlin + Java 9 项目

标签 java gradle kotlin java-9

我对 Gradle(老实说,还有 Java 9)还很陌生,我正在尝试使用 Gradle 构建一个简单的库项目,它混合了 Java 9 和 Kotlin。更详细地说,Java 中有一个接口(interface),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 compile 任务中指定模块路径,否则编译失败:

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),所以我认为我在这里遗漏了一些非常基本的东西.

提前致谢!

最佳答案

解决了!将 kotlin 编译目录设置为与 Java 相同的目录就足够了:

compileKotlin.destinationDir = compileJava.destinationDir

它现在可以使用同一棵树或不同树中的源;但有一个怪癖:jar 任务会生成一个所有条目都重复的 jar。接下来我会努力解决这个问题。

谢谢大家!

关于java - 使用 Gradle 构建 Kotlin + Java 9 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47657755/

相关文章:

java - 无状态 session bean 中的高效 JDBC 连接管理

android - 我的项目文件未包含在 apk 中

java - 如何在 : file 的应用程序中导入 build.gradle 之外的 gradle 类

kotlin - 如何抑制未经检查的强制转换警告?

Spring Jackson Databind 不适用于我的 Kotlin 数据类

java - java MDB 中处理异常的最佳方法是什么?

java - 在java中将类的实例存储在另一个类中

android - Kotlin编译器在对build.gradle文件进行更改后引发注释错误

c# - 将 C# 字节转换为 Java 字节

java - 如何将带有类的 JAR 文件分发给其他开发人员?