首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Gradle和Kotlin构建一个可执行的JAR

使用Gradle和Kotlin构建一个可执行的JAR
EN

Stack Overflow用户
提问于 2014-10-20 15:29:15
回答 8查看 32.1K关注 0票数 57

为了开始,我编写了一个简单的Kotlin源文件和一个Gradle脚本文件。但我不知道如何将主函数添加到清单中,这样JAR就可以自我执行。

下面是我的build.gradle脚本:

代码语言:javascript
复制
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

代码语言:javascript
复制
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)启动JAR时,我得到了下面的堆栈跟踪,说明Kotlin反射库类丢失了,实际上它们还没有添加到JAR中。似乎我错过了最终JAR中的kotlin编译器工件类,以及kotlin-stdlib源代码,但我不知道如何调整Gradle构建。

代码语言:javascript
复制
$> 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。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2014-10-20 16:16:43

我找到了解决办法(多亏了MkYong网站)

  1. gradle脚本需要kotlin编译器工件作为依赖项。
  2. gradle脚本需要一种收集所有kotlin文件并将其放入jar的方法。

因此,我使用了下面的gradle脚本:

代码语言:javascript
复制
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) } }
}
票数 28
EN

Stack Overflow用户

发布于 2015-05-15 15:14:50

添加插件application,然后将mainClassName设置为

代码语言:javascript
复制
mainClassName = '[your_namespace].[your_arctifact]Kt'

例如,假设您在名为main.kt的文件中放置了以下代码

代码语言:javascript
复制
package net.mydomain.kotlinlearn

import kotlin
import java.util.ArrayList

fun main(args: Array<String>) {

    println("Hello!")

}

您的build.gradle应该是:

代码语言:javascript
复制
apply plugin: 'kotlin'
apply plugin: 'application'

mainClassName = "net.mydomain.kotlinlearn.MainKt"

实际上,Kotlin正在构建一个类来封装您的主函数,其名称与文件的名称相同--带有标题大小写。

票数 37
EN

Stack Overflow用户

发布于 2019-04-22 07:32:52

上述解决方案中没有一个对我有效,因为我正在建造人工制品。

IntelliJ IDEA 2019.1.1. IDE版本

若要修复此问题,请执行以下操作

步骤

步骤1-创建伪影

  1. 转到文件->项目结构->构件
  2. 单击+ -> JAR -> From modules with dependencies

  1. 选择程序的Main Class

步骤2-更改清单路径

  1. Directory for META-INF/MANIFEST.MF的值更改为项目根目录。 例如,从/your/project/directory/src/main/kotlin/your/project/directory

  1. OK,然后按ApplyOK

步骤3-构建伪影

  1. 最后,到Build -> Build Artifacts -> [your-artifact-name] -> Build__。

生成的JAR文件可以在out/artifact/[your-artifact-name]目录中找到。(y)

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26469365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档