gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:32:19 32 4
gpt4 key购买 nike

我对 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com