Котлин: Как создать работающую банку? - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь создать пригодную для работы банку с Kotlin.

Мой gradle.build такой:



plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.3.11'

}

group 'com.github.dynamik'
version '1.0-SNAPSHOT'
apply plugin: 'application'
apply plugin: 'kotlin'
mainClassName = "interpreter.Repl"





repositories {
    mavenCentral()
    maven { setUrl("https://dl.bintray.com/hotkeytlt/maven") }

}
configurations {
    ktlint
}
dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    compile 'com.github.h0tk3y.betterParse:better-parse-jvm:0.4.0-alpha-3'
    // https://mvnrepository.com/artifact/junit/junit
    testCompile group: 'junit', name: 'junit', version: '4.4'
    ktlint "com.github.shyiko:ktlint:0.31.0"




    implementation 'com.github.ajalt:clikt:1.7.0'


    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.0'



}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

run {
    standardInput = System.in
}

jar {
    manifest {
        attributes 'Main-Class': 'interpreter.Repl'
    }
}

(Когда я делаю ./gradlew run, все работает как положено.)

Я читаю статью здесь о том, как действовать, и там говорится: java -jar <MY_PROJECT_NAME>.jar.

Я не совсем понимаю - где мы запускаем это ? Я попытался запустить его из корня моего проекта, и я получил ошибку:

Error: Unable to access jarfile <my_jarname>.jar

Ответы [ 3 ]

0 голосов
/ 16 апреля 2019

Хорошо, я понял это :)

Итак, способ создать банку - это пойти: ./gradlew build.Это создает банку в build/libs.

Проблема заключается в том, что при запуске этого jar может возникнуть исключение около java.lang.intrinsics, поскольку kotlin stdlib не был упакован в банку.

Хотя есть способ сделать это вручную, я обнаружил, что самое простое решение - просто использовать shadowjar plugin.

Мой build.gradle в итоге выглядел так:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.4'
    }
}

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.3.11'

}

group 'com.github.dynamik'
version '1.0-SNAPSHOT'
apply plugin: 'application'
apply plugin: 'kotlin'
apply plugin: 'java'


mainClassName = "interpreter.Repl"

repositories {
    mavenCentral()
    jcenter()
    maven { setUrl("https://dl.bintray.com/hotkeytlt/maven") }
    maven {
        url = uri("https://plugins.gradle.org/m2/")
    }

}
configurations {
    ktlint
}
dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    compile 'com.github.h0tk3y.betterParse:better-parse-jvm:0.4.0-alpha-3'
    // https://mvnrepository.com/artifact/junit/junit
    testCompile group: 'junit', name: 'junit', version: '4.4'
    ktlint "com.github.shyiko:ktlint:0.31.0"
    implementation 'com.github.ajalt:clikt:1.7.0'
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.0'

}
apply plugin: 'com.github.johnrengelman.shadow'



compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

run {
    standardInput = System.in
}

jar {
    manifest {
        attributes 'Main-Class': 'interpreter.Repl'
    }
}

0 голосов
/ 10 июня 2019

Начиная с Gradle 5.4.1, для build.gradle.kts потребуется такой раздел:

tasks.register<Jar>("uberJar") {
    archiveClassifier.set("uber")

    manifest {
        attributes(
                "Main-Class" to "mytest.AppKt",
                "Implementation-Title" to "Gradle",
                "Implementation-Version" to archiveVersion
        )
    }

    from(sourceSets.main.get().output)

    dependsOn(configurations.runtimeClasspath)
    from({
        configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) }
    })
}
0 голосов
/ 16 апреля 2019

При использовании основного класса Kotlin вам необходимо добавить Kt в конце имени класса, ссылаясь на него в MANIFEST.Итак, если ваш основной класс называется interpreter.Repl, используйте:

jar {
    manifest {
        attributes 'Main-Class': 'interpreter.ReplKt'
    }
}

вместо

jar {
    manifest {
        attributes 'Main-Class': 'interpreter.Repl'
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...