如何使用来自 Ktor Kotlin/Java 应用程序的 gradle 构建有效的 JAR 文件

Posted

技术标签:

【中文标题】如何使用来自 Ktor Kotlin/Java 应用程序的 gradle 构建有效的 JAR 文件【英文标题】:How to build valid JAR file with gradle from Ktor Kotlin/Java app 【发布时间】:2018-07-05 22:23:05 【问题描述】:

我一直在尝试为我的 Kotlin/Java Ktor 项目创建一个可执行的 JAR。使用我的 gradle 脚本创建实际的 JAR 很简单,但无论出于何种原因,我都无法弄清楚如何克服错误消息:“JAR 文件:找不到主类 routing.MainKt”。我的 Kotlin 主函数位于包路由中名为 Main.kt 的文件中。下面是我的 gradle 文件。我做错了什么?

buildscript 
   ext.kotlin_version = '1.2.21'
   ext.ktorVersion = '0.9.0'

repositories 
    mavenCentral()

dependencies 
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
  


apply plugin: 'java'
apply plugin: 'kotlin'

sourceCompatibility = 1.8
compileKotlin 
  kotlinOptions.jvmTarget = "1.8"

compileTestKotlin 
  kotlinOptions.jvmTarget = "1.8"


kotlin 
  experimental 
     coroutines "enable"
  


jar 
  manifest 
     attributes 'Main-Class': "routing.MainKt"
  

  from 
     configurations.compile.collect  it.isDirectory() ? it : zipTree(it) 
  


repositories 
  mavenCentral()
  jcenter()
  maven  url "https://dl.bintray.com/kotlin/kotlinx" 
  maven  url "https://dl.bintray.com/kotlin/ktor" 
  maven  url "http://repository.jetbrains.com/kotlin-nosql" 
  maven  url "https://oss.sonatype.org/content/repositories/snapshots" 


dependencies 
  //Core Ktor libs
  compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
  compile "io.ktor:ktor-server-core:$ktorVersion"
  compile "io.ktor:ktor-server-netty:$ktorVersion"
  compile "io.ktor:ktor-freemarker:$ktorVersion"
  compile "io.ktor:ktor-locations:$ktorVersion"
  ...Other libs

编辑:当我在生成的 jar 上运行 jar tf 时,我得到以下相关信息:

routing/MainKt$chartsxyzApplication$5.class
routing/MainKt$chartsxyzApplication$5$1.class
routing/MainKt$chartsxyzApplication$4.class
routing/MainKt$chartsxyzApplication$4$1.class
routing/MainKt.class
routing/MainKt$redirect$1.class
routing/MainKt$chartsxyzApplication$5$2.class
routing/MainKt$chartsxyzApplication$2.class
routing/MainKt$chartsxyzApplication$1.class
routing/MainKt$chartsxyzApplication$3.class
routing/MainKt$main$1.class

Edit2:这是 Main.kt 的基础知识

package routing

import io.ktor.application.*
...

@location("/")
class Index
... A bunch of other locations

fun main(args: Array<String>) 
   embeddedServer(Netty, 8080, module = Application::chartsApplication).start()


fun Application.chartsApplication()
   ...


suspend fun ApplicationCall.redirect(location: Any) 
   ...


fun ApplicationCall.refererHost() = request.header(HttpHeaders.Referrer)?.let  URI.create(it).host 

【问题讨论】:

您获得的 JAR 是否包含 routing/MainKt.class 处的类文件条目? 是的。当我在 jar 上运行“java tf”时,我将使用路由/输出更新我的问题 你能把你的 Main.kt 也包括进来吗?至少没有正文的***声明。 @IlyaRyzhenkov 添加 【参考方案1】:

这是使用 shadowjar 插件的替代方法。

task fatJar(type: Jar) 
    manifest 
        attributes 'Implementation-Title': project.name,
                'Implementation-Version': version,
                'Main-Class': 'class.path.to.MainKt'
    
    baseName = project.name
    from  configurations.compile.collect  it.isDirectory() ? it : zipTree(it)  
    exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA'
    with jar

【讨论】:

【参考方案2】:

我认为对你来说最简单的方法是使用shadowjar plugin

它会将你所有的库包含到你的 jar 中。

【讨论】:

你是救生员。我花了几个小时在这上面,最后用你的建议解决了这个问题。谢谢!

以上是关于如何使用来自 Ktor Kotlin/Java 应用程序的 gradle 构建有效的 JAR 文件的主要内容,如果未能解决你的问题,请参考以下文章

KMM 错误:此 API 在 ktor 内部,不应使用。它可能会被删除或更改,恕不另行通知

来自 UserHashedTableAuth 的 Ktor 基本身份验证

基本身份验证应在邮递员中响应 500(授权),但 401 Unauthorized 可以正常工作。使用 ktor intellij mongodb

Ktor 中的后台任务,例如 ASP.Net Core 中的“托管服务”

Ktor 客户端的 JsonFeature 未解决

使用 ktor 将文件上传到电报 bot api