我对Gradle相当陌生(老实说,Java 9 ),我正在尝试使用Gradle来构建一个简单的库项目,它是Java 9和Kotlin的混合体。更详细地说,Java中有一个接口,Kotlin中有一个实现;我会用Kotlin做所有事情,但是modules-info.java无论如何都是java,所以我决定这样做。
我构建在IntelliJ Idea的基础上,外部定义了1.2.0Kotlin插件和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,并行,worker,threadPool);
我认为编译的Kotlin部分运行良好,那么java部分就会失败,因为它不能“看到”kotlin方面,可以说。
我想我应该告诉它如何在类路径中加载已经编译的kotlin类;但是(首先)如何在gradle中做到这一点?第二,这可能吗?我认为在Java 9中不能混合模块路径和类路径。
我怎么才能解决这个问题?我认为这是一种非常常见的情况,因为每个java9 9风格的模块都将是一个混合语言模块(因为有module-info.java),所以我认为这里缺少一些非常基本的东西。
提前感谢!
发布于 2017-12-06 08:18:29
解决了!只需将kotlin编译dir设置为与Java相同的dir即可:
compileKotlin.destinationDir = compileJava.destinationDir它现在可以工作了,无论是在同一棵树中的源还是在不同的树中;但是有一种奇怪的情况:jar任务生成一个包含所有重复条目的jar。我会努力解决这个问题的,下一个。
感谢大家!
发布于 2018-03-14 21:33:32
我正在使用下面的gradle脚本,其中我将模块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,看看正在使用的当前版本。
发布于 2019-10-03 16:48:21
接受的答案对我没有用(至少对我来说不是这样),但这才是有效的:
plugins {
id "org.jetbrains.kotlin.jvm" version "1.3.50"
}
compileKotlin {
doFirst {
destinationDir = compileJava.destinationDir
}
}
jar {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}正如公认的答案所暗示的那样,这导致我犯了这个错误:
目录'/path/to/project/build/classes/kotlin/main‘指定为属性'compileKotlinOutputClasses’不存在。
分级版本:5.6
https://stackoverflow.com/questions/47657755
复制相似问题