Skip to content

WAR

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:

Kotlin
Groovy
XML

如果您使用 9.x 或更早版本的 Tomcat/Jetty,请改为添加 ktor-server-servlet artifact。

请注意,当 Ktor 应用程序部署在 servlet 容器中时,您不需要单独的 Jetty 或 Tomcat artifact

配置 servlet

要在应用程序中注册 Ktor servlet,请打开 WEB-INF/web.xml 文件并将 ServletApplicationEngine 赋值给 servlet-class 属性:

xml
<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>
XML

然后,为此 servlet 配置 URL 模式:

xml
<servlet-mapping>
    <servlet-name>KtorServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

配置 Gretty

Gretty 插件允许您在 Jetty 和 Tomcat 上 运行 servlet 应用程序。要安装此插件,请打开 build.gradle.kts 文件并将以下代码添加到 plugins 块中:

groovy
plugins {
    id("org.gretty") version "4.0.3"
}

然后,您可以在 gretty 块中进行如下配置:

groovy
gretty {
    servletContainer = "jetty11"
    contextPath = "/"
    logbackConfigFile = "src/main/resources/logback.xml"
}
groovy
gretty {
    servletContainer = "tomcat10"
    contextPath = "/"
    logbackConfigFile = "src/main/resources/logback.xml"
}

最后,配置 run 任务:

groovy
afterEvaluate {
    tasks.getByName("run") {
        dependsOn("appRun")
    }
}

配置 War

War 插件允许您 生成 WAR 归档文件。您可以通过在 build.gradle.kts 文件中的 plugins 块中添加以下行来安装它:

groovy
plugins {
    id("war")
}

运行应用程序

您可以使用 配置好的 Gretty 插件 通过 run 任务来运行 servlet 应用程序。例如,以下命令运行 jetty-war 示例:

Bash
./gradlew :jetty-war:run

生成并部署 WAR 归档文件

要使用 War 插件生成应用程序的 WAR 文件,请执行 war 任务。对于 jetty-war 示例,命令如下所示:

Bash
./gradlew :jetty-war:war

jetty-war.war 会在 build/libs 目录中创建。您可以通过将其复制到 jetty/webapps 目录来将生成的归档文件部署到 servlet 容器中。例如,下面的 Dockerfile 展示了如何在 Jetty 或 Tomcat servlet 容器中运行创建的 WAR:

Docker
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"]
Docker
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-wartomcat-war