有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用Java 1.7为Kotlin配置Gradle

好吧,我是Gradle和Kotlin的新手,我很难理解这里的东西是如何粘合在一起的

我需要配置一个应该在Java7上运行的项目(客户端限制--),我想使用Kotlin

现在我有以下build.gradle文件正在运行,但我想问一些其他地方找不到的问题:

buildscript {
    ext {
        springBootVersion = '1.5.15.RELEASE'
        kotlin_version = '1.1.1'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'

group = 'com.springkotlin'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.7
targetCompatibility = 1.7

repositories {
    mavenCentral()
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-data-rest')
    compile('org.springframework.boot:spring-boot-starter-security')
    compile('com.onelogin:java-saml:2.3.0')
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7"
    runtime('org.springframework.boot:spring-boot-devtools')
    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile('org.springframework.security:spring-security-test')
    testCompile group: 'javax.inject', name: 'javax.inject', version: '1'
}

compileKotlin {
    kotlinOptions {
        jvmTarget = "1.6"
    }
}

现在问题是:

  1. 我试过使用kotlin_version = '1.2.70'(最近几天发布!)我得到了错误KotlinPluginWrapper : Unsupported major.minor version 52.0。我猜这是因为Kotlin 1.2。X只能“编译”(就是这个词吗?)使用Java8+。是这样吗?这里使用的1.1.1是正确的版本,还是有一种方法可以使用1.2.70来处理Java7?我会因为使用它而错过很多东西吗

  2. 我想了解我必须在脚本上设置的3Kotlin内容。请纠正我:

    • kotlin-gradle-plugin:用于定义Kotlin I将使用哪个版本(?)
    • apply plugin: 'kotlin':据我从Gradle所知,这应该会添加任务来与Kotlin一起工作,但是运行gradle tasks我没有看到任何不同。。。那么它到底是为了什么
    • kotlin-stdlib-jdk7:我猜这是函数、类等的Kotlin库。但我不明白的是stdlibstdlib-jdk7之间的区别。{a1}表示它包含“加法扩展函数”。但是哪一个呢?还有,我应该为这个家伙定义一个版本吗?或者它会自动选择kotlin-gradle-plugin版本吗

提前感谢,


共 (2) 个答案

  1. # 1 楼答案

    1. Kotlin可以针对Java 6或Java 8,我认为这一点没有改变。但是,默认值很可能已从Java 6更改为Java 8,因此请尝试使用suggested here

      compileKotlin {
          sourceCompatibility = JavaVersion.VERSION_1_6
          targetCompatibility = JavaVersion.VERSION_1_6
      
          kotlinOptions {
              jvmTarget = "1.6"
              apiVersion = "1.2"
              languageVersion = "1.2"
          }
      }
      
    2. kotlin-gradle-plugin的版本是用来编译代码的Kotlin编译器的版本。stdlib的版本就是运行库的版本。强烈建议在此处使用相同的版本

    3. apply plugin: kotlin在引擎盖下添加了一些任务——只需继续使用java任务,如gradle assemblegradle buildgradle run,因为它们将调用kotlin特定的任务

    4. kotlin-stdlib-jdk7增加的价值很小——除非您使用java 7中引入的java库的特性,这些特性具有Kotlin的stdlib的扩展,否则只需使用默认的stdlib就可以了(它以java 6为目标,并且无论如何都是kotlin-stdlib-jdk7的依赖项)

  2. # 2 楼答案

    目前,Kotlin语言的编译器需要运行JDK 8。使用Kotlin编译的项目可以针对从Java6开始的任何Java

    设置在Java 7上运行的项目的Gradle build的方法如下:

    • 使用Java 8或更高版本运行Gradle
    • 对于所有Kotlin编译任务
      • kotlinOptions中指定jvmTarget = "1.6"
      • jdkHome中指定JDK 7的路径在kotlinOptions
    • 如果项目包含java代码,请指定java插件的sourceCompatibilitytargetCompatibility约定属性
    • 指定所有java编译任务的以下options
      • isFork = true
      • forkOptions.javaHome = "<path to JDK 7>"
    • 对于所有测试任务,将executable指定为"<path to JDK 7>/bin/java"

    完整样本:

    sourceCompatibility = 1.7
    targetCompatibility = 1.7
    
    def JDK_7 = System.getenv("JDK_7") // or some other way to get path to JDK 7 installation
    
    tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {
        kotlinOptions {
            jvmTarget = "1.6"
            jdkHome = JDK_7
        }
    }
    
    tasks.withType(JavaCompile) {
        options.fork = true
        options.forkOptions.javaHome = file(JDK_7)
    }
    
    test {
        executable = "$JDK_7/bin/java"
    }