如何从Ktor Kotlin/Java应用程序中使用gradle构建有效的JAR文件
我一直在尝试为我的Kotlin/JavaKTOR项目创建一个可执行JAR。用我的gradle脚本创建实际的JAR很简单,但无论出于什么原因,我一辈子都无法弄清楚如何克服错误消息:“JAR文件:找不到主类routing.MainKt”。My Kotlin main函数位于包路由中名为main.kt的文件中。下面是我的gradle文件。我做错了什么如何从Ktor Kotlin/Java应用程序中使用gradle构建有效的JAR文件,java,gradle,jar,kotlin,ktor,Java,Gradle,Jar,Kotlin,Ktor,我一直在尝试为我的Kotlin/JavaKTOR项目创建一个可执行JAR。用我的gradle脚本创建实际的JAR很简单,但无论出于什么原因,我一辈子都无法弄清楚如何克服错误消息:“JAR文件:找不到主类routing.MainKt”。My Kotlin main函数位于包路由中名为main.kt的文件中。下面是我的gradle文件。我做错了什么 buildscript { ext.kotlin_version = '1.2.21' ext.ktorVersion = '0.9.0'
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 }
包路由
导入io.ktor.application*
...
@位置(“/”)
类索引
... 其他一些地点
趣味主线(args:Array){
嵌入式服务器(Netty,8080,module=Application::chartsApplication).start()
}
有趣的应用程序{
...
}
suspend fun ApplicationCall.redirect(位置:任意){
...
}
fun ApplicationCall.refererHost()=request.header(HttpHeaders.referer)?.let{URI.create(it.host}
我认为最简单的方法是使用
它将把你所有的库都包含到你的jar中。这里有一个替代使用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
}
您得到的JAR是否包含位于
routing/MainKt.class
的类文件条目?是的。当我在jar上运行“javatf”时,我将用路由/输出更新我的问题。你也可以包括Main.kt吗?至少是没有实体的顶级声明。@Ilyzhenkov补充道你是救命恩人。我花了几个小时在这个问题上,最后根据你的建议解决了这个问题。谢谢