一旦你準備好了應用程式,可能會想部署到容器。
打包
在部署時,通常您需要生成一個包含所有類,依賴項和資源的歸檔檔案:在單個JAR歸檔檔案(也稱為Fat JAR)或WAR檔案(Web應用程式資源)中。
Fat JAR
fat-jar(或uber-jar)歸檔檔案是一個普通的jar檔案單個歸檔檔案,它將所有依賴項打包在一起,因此可以使用Java直接執行獨立的應用程式:
java -jar yourapplication.jar
複製程式碼
在部署到heroku或使用nginx進行反向代理時,是在docker等容器中執行它的首選方法。
使用Gradle時,您可以使用shadow gradle外掛生成它。 例如,要使用netty作為引擎生成Fat JAR:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.4'
}
}
apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: 'kotlin'
apply plugin: 'application'
//mainClassName = 'io.ktor.server.netty.DevelopmentEngine' // For versions < 1.0.0-beta-3
mainClassName = 'io.ktor.server.netty.EngineMain' // Starting with 1.0.0-beta-3
// 這個task會生成fat JAR 並會將其放在 ./build/libs/ directory目錄下
shadowJar {
manifest {
attributes 'Main-Class': mainClassName
}
}
複製程式碼
WAR(Servlet容器)
WAR允許您輕鬆地將應用程式部署到Web容器/ servlet容器中,只需將其複製到其webapps資料夾即可。 Ktor支援兩個流行的servlet容器:Jetty和Tomcat。 它也適用於部署到google app engine。
要生成war檔案,可以使用gretty gradle外掛。 您還需要一個WEB-INF/web.xml,如下所示:
webapp/WEB-INF/web.xml:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- path to application.conf file, required -->
<!-- note that this file is always loaded as an absolute path from the classpath -->
<context-param>
<param-name>io.ktor.ktor.config</param-name>
<param-value>application.conf</param-value>
</context-param>
<servlet>
<display-name>KtorServlet</display-name>
<servlet-name>KtorServlet</servlet-name>
<servlet-class>io.ktor.server.servlet.ServletApplicationEngine</servlet-class>
<!-- required! -->
<async-supported>true</async-supported>
<!-- 100mb max file upload, optional -->
<multipart-config>
<max-file-size>304857600</max-file-size>
<max-request-size>304857600</max-request-size>
<file-size-threshold>0</file-size-threshold>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>KtorServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
複製程式碼
build.gradle:
buildscript {
ext.gretty_version = '2.0.0'
repositories {
jcenter()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.akhikhl.gretty:gretty:$gretty_version"
}
}
apply plugin: 'kotlin'
apply plugin: 'war'
apply plugin: 'org.akhikhl.gretty'
webAppDirName = 'webapp'
gretty {
contextPath = '/'
logbackConfigFile = 'resources/logback.xml'
}
sourceSets {
main.kotlin.srcDirs = [ 'src' ]
main.resources.srcDirs = [ 'resources' ]
}
repositories {
jcenter()
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
compile "io.ktor:ktor-server-servlet:$ktor_version"
compile "io.ktor:ktor-html-builder:$ktor_version"
compile "ch.qos.logback:logback-classic:$logback_version"
}
kotlin.experimental.coroutines = 'enable'
task run
afterEvaluate {
run.dependsOn(tasks.findByName("appRun"))
}
複製程式碼
Proguard
如果您對JAR大小有一些限制(例如,將應用程式部署到heroku時),則可以使用proguard來縮小它。 如果您使用的是gradle,那麼使用proguard-gradle外掛非常簡單。 您只需要記住:主模組方法,EngineMain類和Kotlin反射類。 然後,您可以根據需要對其進行微調:
buildscript {
ext.proguard_version = '6.0.1'
dependencies {
classpath "net.sf.proguard:proguard-gradle:$proguard_version"
}
}
task minimizedJar(type: proguard.gradle.ProGuardTask, dependsOn: shadowJar) {
injars "build/libs/my-application.jar"
outjars "build/libs/my-application.min.jar"
libraryjars System.properties.'java.home' + "/lib/rt.jar"
printmapping "build/libs/my-application.map"
ignorewarnings
dontobfuscate
dontoptimize
dontwarn
def keepClasses = [
'io.ktor.server.netty.EngineMain', // The EngineMain you use, netty in this case.
'kotlin.reflect.jvm.internal.**',
'io.ktor.samples.hello.HelloApplicationKt', // The class containing your module defined in the application.conf
'kotlin.text.RegexOption'
]
for (keepClass in keepClasses) {
keep access: 'public', name: keepClass, {
method access: 'public'
method access: 'private'
}
}
}
複製程式碼