Ger*_*zzo 17 java 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]
Run Code Online (Sandbox Code Playgroud)
module-info.java 是:
module some.package {
requires kotlin.stdlib;
exports some.package;
}
Run Code Online (Sandbox Code Playgroud)
并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"
}
Run Code Online (Sandbox Code Playgroud)
请注意,我必须在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),所以我想我在这里缺少一些非常基本的东西.
提前致谢!
Ger*_*zzo 11
解决了!将kotlin编译目录设置为与Java相同的目录就足够了:
compileKotlin.destinationDir = compileJava.destinationDir
Run Code Online (Sandbox Code Playgroud)
现在它可以使用同一棵树或不同树木中的来源; 但有一个怪癖:jar任务产生一个包含所有条目重复的jar.接下来,我会努力解决这个问题.
谢谢大家!
| 归档时间: |
|
| 查看次数: |
5044 次 |
| 最近记录: |