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 成品:

Kotlin
Groovy
XML

如果您使用 9.x 或更早版本的 Tomcat/Jetty,請改為添加 ktor-server-servlet 成品。

請注意,當 Ktor 應用程式部署在 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 "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")
}

執行應用程式

您可以使用 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 目錄中建立。您可以透過將生成的檔案複製到 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