Как создать .jar (создать исполняемый файл) встроенного сервера Ktor

Я очень новичок в Kotlin, Ktor и Gradle. Удалось создать встроенный сервер, как описано на сайте Ktor, со следующим кодом:

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()
}

и 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"
    }
}

Сервер работает нормально по адресу: localhost:8080

и я вижу следующие файлы в папке out:

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

Как я могу узнать, создать исполняемый файл .jar этого сервера, чтобы я мог раздать его пользователю?

введите описание изображения здесь


person Hasan A Yousef    schedule 22.09.2017    source источник


Ответы (1)


Что вам нужно сделать, так это добавить следующий фрагмент кода в файл build.gradle:

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

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

Затем запустите: gradle clean jar. После завершения перейдите к: build/libs и запустите java -jar <jar_name>.jar.

Или запустите его, используя javaw -jar <jar_name>.jar вместо java (вам может потребоваться убедиться, что он находится на пути, если JAVA_HOME не определен правильно). Это запустит его без какой-либо консоли.

P.S. Вы также можете использовать плагин application или shadowJar.

person Opal    schedule 22.09.2017
comment
Когда я запускаю его с терминала IJ, я получаю эту ошибку: «gradle» не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл. - person Hasan A Yousef; 22.09.2017
comment
когда я запускал его из cmd, я получил это: * Что пошло не так: Задача «очистить» не найдена в корневом проекте «блог». - person Hasan A Yousef; 22.09.2017
comment
@HasanAYousef, вы уверены, что запускаете его из правильного места и применяете плагины java и kotlin? - person Opal; 22.09.2017
comment
Что-то кажется неправильным в моей настройке, когда я использовал только текстовый редактор и командную строку, создавая файлы с помощью gradle init --type java-library, затем создавая свои файлы и компилируя их gradle clean jar, все прошло гладко, как вы описали. - person Hasan A Yousef; 23.09.2017
comment
@HasanAYousef, понятия не имею, что могло вызвать проблему, но я рад, что теперь это работает! - person Opal; 23.09.2017