Skip to content

WAR

代码示例jetty-wartomcat-wartomcat-war-ssl

您可以在 servlet 容器(如 Tomcat 或 Jetty)中运行 Ktor 应用程序。为此,您需要将应用程序打包为 WAR 归档文件,并将其部署到支持 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 构件添加到您的构建脚本中:

Kotlin
Groovy
XML

部署到 servlet 容器时,您不需要添加单独的 Jetty 或 Tomcat 引擎依赖项

配置 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 "5.0.1"
}

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

groovy
gretty {
    servletContainer = "jetty12"
    contextPath = "/"
}
groovy
gretty {
    servletContainer = "tomcat10"
    contextPath = "/"
}

最后,配置 run 任务:

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

配置 War 插件

War 插件允许您生成用于部署到 servlet 容器的 WAR 归档文件。

要应用该插件,请打开您的 build.gradle.kts 文件,并在 plugins 块中添加以下条目:

groovy
plugins {
    id("war")
}

运行应用程序

您可以使用 run 任务运行配置了 Gretty 插件的 servlet 应用程序。例如,要运行 jetty-war 示例项目,请运行以下命令:

Bash
./gradlew :jetty-war:run

生成并部署 WAR 归档文件

要使用 War 插件生成 WAR 归档文件,请运行 war 任务。对于 jetty-war 示例项目,命令如下所示:

Bash
./gradlew :jetty-war:war

任务完成后,jetty-war.war 将在对应模块的 build/libs 目录中可用。

要部署生成的归档文件,请将文件复制到 servlet 容器中的 jetty/webapps 目录。

以下 Dockerfile 示例展示了如何在 Jetty 或 Tomcat servlet 容器中运行生成的 WAR 文件:

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