WAR
代码示例: jetty-war, tomcat-war, tomcat-war-ssl
Ktor 应用程序可以在包括 Tomcat 和 Jetty 在内的 servlet 容器中运行和部署。要在 servlet 容器中部署,您需要生成一个 WAR 归档文件,然后将其部署到支持 WAR 的服务器或云服务上。
在本主题中,我们将向您展示如何:
- 配置 Ktor 以在 servlet 应用程序中使用;
- 应用 Gretty 和 War 插件以运行和打包 WAR 应用程序;
- 运行 Ktor servlet 应用程序;
- 生成并部署 WAR 归档文件。
在 servlet 应用程序中配置 Ktor
Ktor 允许您直接在应用程序中 创建并启动服务器,并使用所需的引擎(例如 Netty、Jetty 或 Tomcat)。在这种情况下,您的应用程序可以控制引擎设置、连接和 SSL 选项。
与上述方法相反,servlet 容器应控制应用程序的生命周期和连接设置。Ktor 提供了一个特殊的 ServletApplicationEngine 引擎,它将应用程序的控制权委托给 servlet 容器。
请注意,当 Ktor 应用程序部署在 servlet 容器中时,连接和 SSL 设置 不会生效。 tomcat-war-ssl 示例演示了如何在 Tomcat 中配置 SSL。
添加依赖项
要在 servlet 应用程序中使用 Ktor,您需要在构建脚本中包含 ktor-server-servlet-jakarta
artifact:
如果您使用 9.x 或更早版本的 Tomcat/Jetty,请改为添加 ktor-server-servlet
artifact。
请注意,当 Ktor 应用程序部署在 servlet 容器中时,您不需要单独的 Jetty 或 Tomcat artifact。
配置 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 "4.0.3"
}
然后,您可以在 gretty
块中进行如下配置:
gretty {
servletContainer = "jetty11"
contextPath = "/"
logbackConfigFile = "src/main/resources/logback.xml"
}
gretty {
servletContainer = "tomcat10"
contextPath = "/"
logbackConfigFile = "src/main/resources/logback.xml"
}
最后,配置 run
任务:
afterEvaluate {
tasks.getByName("run") {
dependsOn("appRun")
}
}
配置 War
War 插件允许您 生成 WAR 归档文件。您可以通过在 build.gradle.kts
文件中的 plugins
块中添加以下行来安装它:
plugins {
id("war")
}
运行应用程序
您可以使用 配置好的 Gretty 插件 通过 run
任务来运行 servlet 应用程序。例如,以下命令运行 jetty-war 示例:
./gradlew :jetty-war:run
生成并部署 WAR 归档文件
要使用 War 插件生成应用程序的 WAR 文件,请执行 war
任务。对于 jetty-war 示例,命令如下所示:
./gradlew :jetty-war:war
jetty-war.war
会在 build/libs
目录中创建。您可以通过将其复制到 jetty/webapps
目录来将生成的归档文件部署到 servlet 容器中。例如,下面的 Dockerfile
展示了如何在 Jetty 或 Tomcat servlet 容器中运行创建的 WAR:
FROM jetty:11.0.25
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.41
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。