2
votes

Kotlin: Comment créer un pot exécutable?

J'essaye de créer un pot exécutable avec Kotlin.

Mon gradle.build est le suivant:

Error: Unable to access jarfile <my_jarname>.jar

(Dans l'état actuel des choses, quand je fais ./gradlew run , tout fonctionne comme prévu. )

Je lis un article ici sur la façon de procéder, et il est dit de faire: java -jar .jar.

Je ne comprends pas très bien ceci - où exécutons-nous cela ? J'ai essayé de l'exécuter à partir de la racine de mon projet et j'ai eu une erreur:


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'
    }
}


0 commentaires

3 Réponses :


-1
votes

Lorsque vous utilisez une classe principale Kotlin, vous devez ajouter un Kt à la fin du nom de la classe tout en le référençant sur MANIFEST. Donc, si votre classe principale s'appelle interpreter.Repl , utilisez:

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

au lieu de

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


4 commentaires

Vous devrez également intégrer kotlin sdtlib dans votre fichier .jar généré.


merci pour les pointeurs! Juste une petite question cependant: comment cette commande java -jar .jar est censée être exécutée? Je cherche ici stackoverflow. com / questions / 5258159 /… et il semble qu'il doive pointer vers des fichiers .class en java - est-ce la même chose avec kotlin?


Lorsque vous utilisez -jar , vous devrez pointer vers un fichier .jar. Dans votre cas, votre fichier .jar généré. Il est censé exécuter le jar exactement comme le fait votre IDE. Si vous n'imprimez rien, vous n'aurez aucune sortie sur java -jar xxx.jar


cool merci! Je suppose que je dois d'abord comprendre comment créer le fichier .jar.



1
votes

Ok, j'ai compris :)

Donc, la façon de créer un pot est d'aller: ./gradlew build . Cela crée un fichier jar dans build / libs .

Le problème est que, lors de l'exécution de ce fichier jar, on rencontrerait une exception à propos de java.lang.intrinsics car le kotlin stdlib n'a pas été emballé dans le pot.

Bien qu'il existe un moyen d'accomplir cela manuellement, j'ai trouvé que la solution la plus simple est simplement d'utiliser le plugin shadowjar .

Ma build.gradle a fini par ressembler à ceci:

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'
    }
}


2 commentaires

comment exécuter le fichier jar kotlin, certains où est étudié le fichier jar n'est pas exécutable pour kotlin. Guidez-moi s'il-vous-plaît.


> Plugin avec l'ID 'com.github.johnrengelman.shadow' introuvable.



3
votes

À partir de Gradle 5.4.1, un build.gradle.kts aurait besoin d'une section comme celle-ci:

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 commentaires