Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create .jar (Create Executable) of the Ktor embedded Server

I'm very new to Kotlin and Ktor and Gradle. Was able to create embedded server as explained in Ktor site, with the following code:

BlogApp.kt:

package blog

import org.jetbrains.ktor.netty.*
import org.jetbrains.ktor.routing.*
import org.jetbrains.ktor.application.*
import org.jetbrains.ktor.features.*
import org.jetbrains.ktor.host.*
import org.jetbrains.ktor.http.*
import org.jetbrains.ktor.response.*

fun Application.module() {
    install(DefaultHeaders)
    install(CallLogging)
    install(Routing) {
        get("/") {
            call.respondText("My Example Blog  sfs 122", ContentType.Text.Html)
        }
    }
}

fun main(args: Array<String>) {
    embeddedServer(Netty, 8080, watchPaths = listOf("BlogAppKt"), module = Application::module).start()
}

and build.gradle:

group 'Example'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.1.4-3'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

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

sourceCompatibility = 1.8
ext.ktor_version = '0.4.0'

repositories {
    mavenCentral()
    maven { url  "http://dl.bintray.com/kotlin/ktor" }
    maven { url "https://dl.bintray.com/kotlin/kotlinx" }
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
    compile "org.jetbrains.ktor:ktor-core:$ktor_version"
    compile "org.jetbrains.ktor:ktor-netty:$ktor_version"
    compile "ch.qos.logback:logback-classic:1.2.1"
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
kotlin {
    experimental {
        coroutines "enable"
    }
}

The server run fine at: localhost:8080

and the I can see the below files in the out folder:

C:\Users\Home\IdeaProjects\Example\out\production\classes\blog

How can I know create an executable file .jar of this server, so I can distribute it to the user?

enter image description here

like image 881
Hasan A Yousef Avatar asked Sep 22 '17 13:09

Hasan A Yousef


1 Answers

What you need to do is to add the following piece of code to build.gradle file:

jar {
    baseName '<jar_name>'
    manifest {
        attributes 'Main-Class': 'blog.BlogAppKt'
    }

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

Then run: gradle clean jar. After it's finished navigate to: build/libs and run java -jar <jar_name>.jar.

Or run it using javaw -jar <jar_name>.jar instead of java (you might need to make sure its on the path if the JAVA_HOME is not defined well). This will run it without any console.

P.S. You can also use application plugin or shadowJar.

like image 144
Opal Avatar answered Oct 14 '22 12:10

Opal