WAR
程式碼範例: jetty-war、 tomcat-war、 tomcat-war-ssl
您可以在 Tomcat 或 Jetty 等 Servlet 容器中執行 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。
