Gradle 使用Kotlin DSL构建Fatjar时出错

Gradle 使用Kotlin DSL构建Fatjar时出错,gradle,kotlin,gradle-kotlin-dsl,kotlin-dsl,http4k,Gradle,Kotlin,Gradle Kotlin Dsl,Kotlin Dsl,Http4k,我正在尝试使用ShadowJar构建一个fatjar。下面是我的应用程序和渐变代码。我正在使用Gradle 5.0进行构建。当我运行./gradlew run时,代码运行正常。当我运行'gradleshadowjar',并在'build/lib'文件夹中使用'java-jar'运行fatjar时,我得到以下错误 我猜依赖项没有加载到fatjar中?我还使用Groovy构建了Gradle文件,我得到了相同的错误 我没有在fatjar文件中包含所有依赖项,对吗?如果是这样的话,你知道如何修改Grad

我正在尝试使用ShadowJar构建一个fatjar。下面是我的应用程序和渐变代码。我正在使用Gradle 5.0进行构建。当我运行./gradlew run时,代码运行正常。当我运行'gradleshadowjar',并在'build/lib'文件夹中使用'java-jar'运行fatjar时,我得到以下错误

我猜依赖项没有加载到fatjar中?我还使用Groovy构建了Gradle文件,我得到了相同的错误

我没有在fatjar文件中包含所有依赖项,对吗?如果是这样的话,你知道如何修改Gradle文件以确保它被包括在内吗

格雷德尔·科特林DSL

import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    // Apply the Kotlin JVM plugin to add support for Kotlin on the JVM.
    id("org.jetbrains.kotlin.jvm").version("1.3.21")

    id("com.github.johnrengelman.shadow") version "5.0.0"

    // Apply the application plugin to add support for building a CLI application.
    application
}

repositories {
    // Use jcenter for resolving your dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
    mavenCentral()
}

dependencies {
    // Use the Kotlin JDK 8 standard library.
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")

    // Use the Kotlin test library.
    testImplementation("org.jetbrains.kotlin:kotlin-test")

    // Use the Kotlin JUnit integration.
    testImplementation("org.jetbrains.kotlin:kotlin-test-junit")

    implementation("org.http4k:http4k-core:3.143.1")
    implementation("org.http4k:http4k-server-jetty:3.143.1")
    implementation("org.http4k:http4k-client-okhttp:3.143.1")
    implementation("org.http4k:http4k-client-apache:3.143.1")

}

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "1.8"
}

application {
    // Define the main class for the application.
    mainClassName = "com.benito.AppKt"
}

tasks.withType<ShadowJar>  {
    archiveBaseName.set("${project.name}-all")
}
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
导入org.jetbrains.kotlin.gradle.tasks.KotlinCompile
插件{
//应用Kotlin JVM插件在JVM上添加对Kotlin的支持。
id(“org.jetbrains.kotlin.jvm”).version(“1.3.21”)
id(“com.github.johnrengelman.shadow”)版本“5.0.0”
//应用应用程序插件以添加对构建CLI应用程序的支持。
应用
}
存储库{
//使用jcenter解析依赖项。
//您可以在这里声明任何Maven/Ivy/file存储库。
jcenter()
mavenCentral()
}
依赖关系{
//使用Kotlin JDK 8标准库。
实现(“org.jetbrains.kotlin:kotlin-stdlib-jdk8”)
//使用Kotlin测试库。
测试实施(“org.jetbrains.kotlin:kotlin测试”)
//使用Kotlin JUnit集成。
测试实施(“org.jetbrains.kotlin:kotlin test junit”)
实现(“org.http4k:http4k核心:3.143.1”)
实现(“org.http4k:http4k服务器jetty:3.143.1”)
实现(“org.http4k:http4k客户端okhttp:3.143.1”)
实现(“org.http4k:http4k客户端apache:3.143.1”)
}
tasks.withType{
kotlinOptions.jvmTarget=“1.8”
}
应用{
//定义应用程序的主类。
mainClassName=“com.benito.AppKt”
}
tasks.withType{
archiveBaseName.set(“${project.name}-all”)
}
科特林代码

import org.http4k.core.HttpHandler
import org.http4k.core.Method
import org.http4k.core.Request
import org.http4k.core.Response
import org.http4k.core.Status.Companion.OK
import org.http4k.routing.bind
import org.http4k.routing.path
import org.http4k.routing.routes
import org.http4k.server.Jetty
import org.http4k.server.asServer

fun main(args: Array<String>) {
    println("Starting")


    val app: HttpHandler = routes(
        "/ping" bind Method.GET to { _: Request -> Response(OK).body("pong!") },
        "/greet/{name}" bind Method.GET to { req: Request ->
            val path: String? = req.path("name")
            Response(OK).body("hello ${path ?: "anon!"}")
        }
    )
    app.asServer(Jetty(8080)).start()
}
import org.http4k.core.HttpHandler
导入org.http4k.core.Method
导入org.http4k.core.Request
导入org.http4k.core.Response
导入org.http4k.core.Status.Companion.OK
导入org.http4k.routing.bind
导入org.http4k.routing.path
导入org.http4k.routing.routes
导入org.http4k.server.Jetty
导入org.http4k.server.asServer
趣味主线(args:Array){
println(“开始”)
val app:HttpHandler=路由(
“/ping”bind-Method.GET到{{}:请求->响应(OK).body(“pong!”)},
“/greet/{name}”绑定方法。获取{req:Request->
val路径:字符串?=请求路径(“名称”)
响应(OK).body(“hello${path?:“anon!”)
}
)
app.asServer(Jetty(8080)).start()
}
错误消息

2019-05-15 11:15:13.925:INFO::main: Logging initialized @287ms to org.eclipse.jetty.util.log.StdErrLog
2019-05-15 11:15:14.039:INFO:oejs.Server:main: jetty-9.4.z-SNAPSHOT; built: 2019-04-29T20:42:08.989Z; git: e1bc35120a6617ee3df052294e433f3a25ce7097; jvm 1.8.0_211-b12
Exception in thread "main" java.lang.ExceptionInInitializerError
    at org.eclipse.jetty.http.MimeTypes$Type.<init>(MimeTypes.java:103)
    at org.eclipse.jetty.http.MimeTypes$Type.<clinit>(MimeTypes.java:58)
    at org.eclipse.jetty.http.MimeTypes.<clinit>(MimeTypes.java:191)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:836)
    at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:278)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:167)
    at org.eclipse.jetty.server.Server.start(Server.java:418)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:110)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:113)
    at org.eclipse.jetty.server.Server.doStart(Server.java:382)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.http4k.server.Jetty$toServer$3.start(jetty.kt:33)
    at com.benito.AppKt.main(App.kt:38)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 1
    at org.eclipse.jetty.http.PreEncodedHttpField.<clinit>(PreEncodedHttpField.java:70)
    ... 14 more
2019-05-15 11:15:13.925:INFO::main:Logging在287ms时初始化为org.eclipse.jetty.util.log.StdErrLog
2019-05-15 11:15:14.039:INFO:oejs.Server:main:jetty-9.4.z-SNAPSHOT;建成时间:2019-04-29T20:42:08.989Z;git:e1bc35120a6617ee3df052294e433f3a25ce7097;jvm 1.8.0_211-b12
线程“main”java.lang.ExceptionInInitializeError中出现异常
位于org.eclipse.jetty.http.MimeTypes$Type.(MimeTypes.java:103)
位于org.eclipse.jetty.http.MimeTypes$Type.(MimeTypes.java:58)
位于org.eclipse.jetty.http.MimeTypes(MimeTypes.java:191)
位于org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:836)
位于org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:278)
位于org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
在org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:167)上
位于org.eclipse.jetty.server.server.start(server.java:418)
位于org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:110)
位于org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:113)
位于org.eclipse.jetty.server.server.doStart(server.java:382)
位于org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
位于org.http4k.server.Jetty$toServer$3.start(Jetty.kt:33)
在com.benito.AppKt.main(App.kt:38)
原因:java.lang.ArrayIndexOutOfBoundsException:1
位于org.eclipse.jetty.http.PreEncodedHttpField(PreEncodedHttpField.java:70)
... 14多

这里的问题是,在将所有JAR合并到一个FatJAR的过程中,http4k core JAR中META-INF文件夹的内容(其中包含用于将请求与内容类型匹配的mime.types文件)在某种程度上被合并过程忽略或覆盖

这不是特定于http4k的,并且(相当)是使用shadowjargradle插件的常见问题。但只要正确配置插件即可轻松解决此问题,如下所示:

shadowJar {
    mergeServiceFiles() // <-- this!
}
shadowJar{
合并服务文件()//