【发布时间】:2020-12-02 21:31:06
【问题描述】:
...显然一些必要的东西不包含在依赖项中。
一旦它到达对外部库的调用,它就会中断,要么出现 ClassNotFoundException,要么一言不发。
我从this skeleton project开始。build.gradle的相关改动:
application {
mainClassName = 'net.laca.FoKt'
}
(我的主要功能在fo.kt)
dependencies {
//...
compile "com.sparkjava:spark-core:2.9.3"
implementation 'com.google.code.gson:gson:2.8.6'
implementation fileTree('libs') { include '*.jar' }
}
jar {
archiveBaseName = 'csira'
// Uncommend the last two lines to build a "fat" jar with `./gradlew jar`,
// and run it without Gradle's help: `java -jar build/libs/skeleton.jar`
manifest { attributes 'Main-Class': 'net.laca.FoKt' }
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}
版本:Kotlin 1.4.20、Java 11、Gradle 6.7.1
据称它应该以这种方式工作。就像我以gradle run 开头一样。
但是当我在gradle jar 之后以java -jar build/libs/csira.jar 开始它时,它不会。
fo.kt的相关部分:
package net.laca
import spark.Spark.*
import com.google.gson.GsonBuilder
fun main(args: Array<String>) {
before("/*")
{ req, res ->
res.type("application/json")
println("hívás: ${req.requestMethod()} ${req.pathInfo()} " + req.queryString())
println(GsonBuilder().create().toJson(req.queryMap().toMap())) //line 14
//...
}
在 GsonBuilder 中它会中断:
java.lang.NoClassDefFoundError: com/google/gson/GsonBuilder
at net.laca.FoKt$main$1.handle(fo.kt:14)
at spark.FilterImpl$1.handle(FilterImpl.java:73)
at spark.http.matching.BeforeFilters.execute(BeforeFilters.java:48)
at spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:133)
at ...
...
Caused by: java.lang.ClassNotFoundException: com.google.gson.GsonBuilder
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 19 more
当我删除/注释第 14 行时,它会在 /libs 中调用我自己的 jar:
get("/whatever")
{
println("before")
com.zz.app.MyScalaClass.apply().myFun()
println("after")
}
那么我最后看到的是before,剩下的就是沉默。
【问题讨论】:
标签: kotlin gradle build.gradle spark-java