用Gradle和Kotlin构建一个可自行执行的jar [英] Building a self-executable jar with Gradle and Kotlin

查看:739
本文介绍了用Gradle和Kotlin构建一个可自行执行的jar的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经编写了一个简单的kotlin源文件以便开始使用,并且有一个gradle脚本文件。
但我不知道如何将主要func添加到清单,以便jar可以自行执行。



这里是我的构建。 gradle脚本:

pre $ $ $ $ c $ buildscript {
repositories {
mavenCentral()
}
依赖关系{
classpath'org.jetbrains.kotlin:kotlin-gradle-plugin:0.9.66'
}
}
应用插件:kotlin
版本库{
mavenCentral()
}
依赖关系{
compile'org.jetbrains.kotlin:kotlin-stdlib:0.9.66'
}

jar {
manifest {
属性'Main-Class':'com.loloof64.kotlin.exps.ExpsPackage'
}
}

这是我的com.loloof64.kotlin.exps.Multideclarations.kt

 


$ b class Person(val firstName:String,val lastName:String){
fun component1():String {
返回firstName
}
有趣的component2():字符串{
返回姓氏
}
}

fun main(args:Array<字符串> ){
val(first,last)= Person(Laurent,Bernabé)
println(First name:$ first - Last name:$ last)
}

当我从终端(java -jar MYJar.jar)启动jar时,我得到下面的堆栈跟踪, kotlin反射库类缺失,并且确实没有添加到jar中。看来我错过了最后一个罐子里的kotlin编译器工件类,以及kotlin-stdlib源码,但我不知道如何调整gradle构建。

  $> java -jar build / libs / kotlin_exps.jar 

线程main中的异常java.lang.NoClassDefFoundError:kotlin / reflect / jvm / internal / InternalPackage
at com.loloof64.kotlin。 < clinit>(MultiDeclarations.kt)
由java.net.URLClassLoader $ 1.run .java:372)在java.net.URLClassLoader上
$ 1.run(URLClassLoader.java:361)在java.net上
在java.security.AccessController.doPrivileged(本地方法)上
。 $ URBlassLoader.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解决方案

我找到了解决方法(谢谢到< a href =http://www.mkyong.com/gradle/gradle-create-a-jar-file-with-dependencies/ =noreferrer> MkYong网站)


  1. gradle脚本需要kotlin编译器构件作为依赖关系

  2. gradle脚本需要一种方法来收集所有kotlin文件并把它们放入jar中。

所以我用下面的gradle脚本得到:

  buildscript {
repositories {
mavenCentral()
}
依赖关系{
classpath'org.jetbrains.kotlin :kotlin-gradle-plugin:1.0.1-2'
}
}

应用插件:kotlin

知识库{
mavenCentral()
}

依赖关系{
compile'org.jetbrains.kotlin:kotlin-stdlib:1.0.1-2'
}

jar {
manifest {
属性'Main-Class':'com.loloof64.kotlin.exps.MultideclarationsKT'
}

// NEW线在这里!
来自{configurations.compile.collect {it.isDirectory()? it:zipTree(it)}}
}


I've written a simple kotlin source file in order to get started, and a gradle script file. But I can't figure out how to add the main func to the manifest, so that the jar could be self-executable.

Here my build.gradle script :

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

Here is my 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")
}

When I launch the jar from terminal (java -jar MYJar.jar) I get the following stacktrace, saying me that the kotlin reflection library classes are missing, and indeed they have not been added to the jar. It seems that I am missing the kotlin-compiler artifact classes from the final jar, and also the kotlin-stdlib sources, but I don't know how to adapt the gradle build.

$> 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

I am using Kotlin 0.9.66 and gradle 2.1

解决方案

I've found the workaround (thanks to MkYong website)

  1. The gradle script needed the kotlin-compiler artifact as a dependency
  2. The gradle script needed a way to collect all kotlin files and put them into the jar.

So i get with the following gradle script :

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

这篇关于用Gradle和Kotlin构建一个可自行执行的jar的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆