WAR
代码示例: jetty-war、 tomcat-war、 tomcat-war-ssl
您可以在 servlet 容器(如 Tomcat 或 Jetty)中运行 Ktor 应用程序。为此,您需要将应用程序打包为 WAR 归档文件,并将其部署到支持 WAR 部署的服务器或云服务。
在本主题中,您将学习如何:
- 配置 Ktor 以在 servlet 应用程序中使用。
- 应用 Gretty 和 War 插件来运行和打包 WAR 应用程序。
- 在 servlet 容器中运行 Ktor 应用程序。
- 生成并部署 WAR 归档文件。
在 servlet 应用程序中配置 Ktor
Ktor 允许您直接在应用程序中使用特定引擎(如 Netty、Jetty 或 Tomcat)创建和启动服务器。在这种设置中,由您的应用程序控制引擎配置、连接和 SSL 设置。
当部署到 servlet 容器时,容器将控制应用程序生命周期和连接配置。为此,Ktor 提供了 ServletApplicationEngine 引擎,它将应用程序的控制权委托给 servlet 容器。
在 servlet 容器内部运行时,在配置文件中定义的 Ktor 连接和 SSL 设置将不会生效。
有关在 Tomcat 中配置 SSL 的信息,请参阅 tomcat-war-ssl 示例。
添加依赖项
要在 servlet 应用程序中使用 Ktor,请将 ktor-server-servlet-jakarta 构件添加到您的构建脚本中:
部署到 servlet 容器时,您不需要添加单独的 Jetty 或 Tomcat 引擎依赖项。
配置 servlet
要在您的应用程序中注册 Ktor servlet,请打开 WEB-INF/web.xml 文件,并将 ServletApplicationEngine 分配给 servlet-class 属性:
<servlet>
<display-name>KtorServlet</display-name>
<servlet-name>KtorServlet</servlet-name>
<servlet-class>io.ktor.server.servlet.jakarta.ServletApplicationEngine</servlet-class>
<init-param>
<param-name>io.ktor.ktor.config</param-name>
<param-value>application.conf</param-value>
</init-param>
<async-supported>true</async-supported>
</servlet>然后,为此 servlet 配置 URL 模式:
<servlet-mapping>
<servlet-name>KtorServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>配置 Gretty 插件
Gretty 插件允许您在 Jetty 和 Tomcat 上运行 servlet 应用程序。
要应用该插件,请打开您的 build.gradle.kts 文件,并在 plugins 块中添加以下条目:
plugins {
id("org.gretty") version "5.0.1"
}然后,您可以按如下方式在 gretty 块中进行配置:
gretty {
servletContainer = "jetty12"
contextPath = "/"
}gretty {
servletContainer = "tomcat10"
contextPath = "/"
}最后,配置 run 任务:
afterEvaluate {
tasks.getByName("run") {
dependsOn("appRun")
}
}配置 War 插件
War 插件允许您生成用于部署到 servlet 容器的 WAR 归档文件。
要应用该插件,请打开您的 build.gradle.kts 文件,并在 plugins 块中添加以下条目:
plugins {
id("war")
}运行应用程序
您可以使用 run 任务运行配置了 Gretty 插件的 servlet 应用程序。例如,要运行 jetty-war 示例项目,请运行以下命令:
./gradlew :jetty-war:run生成并部署 WAR 归档文件
要使用 War 插件生成 WAR 归档文件,请运行 war 任务。对于 jetty-war 示例项目,命令如下所示:
./gradlew :jetty-war:war任务完成后,jetty-war.war 将在对应模块的 build/libs 目录中可用。
要部署生成的归档文件,请将文件复制到 servlet 容器中的 jetty/webapps 目录。
以下 Dockerfile 示例展示了如何在 Jetty 或 Tomcat servlet 容器中运行生成的 WAR 文件:
FROM jetty:12.0.29
EXPOSE 8080:8080
COPY ./build/libs/jetty-war.war/ /var/lib/jetty/webapps
WORKDIR /var/lib/jetty
CMD ["java","-jar","/usr/local/jetty/start.jar"]FROM tomcat:10.1.50
EXPOSE 8080:8080
COPY ./build/libs/tomcat-war.war/ /usr/local/tomcat/webapps
WORKDIR /usr/local/tomcat
CMD ["catalina.sh", "run"]有关完整示例,请参阅 jetty-war 和 tomcat-war。
