Создание самоисполняемой банки с Gradle и Kotlin

Я написал простой исходный файл kotlin для начала работы и файл сценария градиента. Но я не могу понять, как добавить основной функционал в манифест, чтобы банка могла быть самоисполняемой.

Вот мой скрипт build.gradle:

buildscript { repositories { mavenCentral() } dependencies { classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:0.9.66' } } apply plugin: "kotlin" repositories { mavenCentral() } dependencies { compile 'org.jetbrains.kotlin:kotlin-stdlib:0.9.66' } jar { manifest { attributes 'Main-Class': 'com.loloof64.kotlin.exps.ExpsPackage' } } 

Вот мой com.loloof64.kotlin.exps.Multideclarations.kt

 package com.loloof64.kotlin.exps class Person(val firstName: String, val lastName: String) { fun component1(): String { return firstName } fun component2(): String { return lastName } } fun main(args: Array < String > ) { val(first, last) = Person("Laurent", "Bernabé") println("First name : $first - Last name : $last") } 

Когда я запускаю банку с терминала (java -jar MYJar.jar), я получаю следующий стек, говорящий мне, что классы библиотеки классов kotlin отсутствуют, и действительно, они не были добавлены в банку. Кажется, что я пропускаю классы артефакта kotlin-компилятора из финальной банки, а также источники kotlin-stdlib, но я не знаю, как адаптировать конструкцию градиента.

 $> java -jar build/libs/kotlin_exps.jar Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/reflect/jvm/internal/InternalPackage at com.loloof64.kotlin.exps.ExpsPackage.<clinit>(MultiDeclarations.kt) Caused by: java.lang.ClassNotFoundException: kotlin.reflect.jvm.internal.InternalPackage at java.net.URLClassLoader$1.run(URLClassLoader.java:372) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:360) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 1 more 

Я использую Kotlin 0.9.66 и gradle 2.1

Solutions Collecting From Web of "Создание самоисполняемой банки с Gradle и Kotlin"

Добавьте application плагина, затем установите mainClassName как

 mainClassName = '[your_namespace].[your_arctifact]Kt' 

Например, предположим, что вы поместили следующий код в файл с именем main.kt :

 package net.mydomain.kotlinlearn import kotlin import java.util.ArrayList fun main(args: Array<String>) { println("Hello!") } 

ваш build.gradle должен быть:

 apply plugin: 'kotlin' apply plugin: 'application' mainClassName = "net.mydomain.kotlinlearn.MainKt" 

На самом деле Kotlin создает класс для инкапсуляции вашей основной функции с таким же именем вашего файла – с помощью Title Case.

Я нашел обходное решение (благодаря сайту MkYong )

  1. Скрипт градиента нуждался в артефакте kotlin-compiler как зависимости
  2. Скрипт gradle должен был собрать все файлы kotlin и поместить их в банку.

Поэтому я получаю следующий сценарий градиента:

 buildscript { repositories { mavenCentral() } dependencies { classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.1-2' } } apply plugin: "kotlin" repositories { mavenCentral() } dependencies { compile 'org.jetbrains.kotlin:kotlin-stdlib:1.0.1-2' } jar { manifest { attributes 'Main-Class': 'com.loloof64.kotlin.exps.MultideclarationsKT' } // NEW LINE HERE !!! from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } } 

В случае, если вы оказываетесь глупыми, как я:

Не создавайте конфигурацию запуска IntelliJ как приложение. IntelliJ предположит, что это Java, и он никогда не будет работать. Вместо этого используйте запись «Котлин».