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
.
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' } }
3 Réponses :
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' } }
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
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.
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' } }
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.
À 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) } }) }