如何使用命令列運行 WAR 檔案中的類
1. 概述
WAR 檔案是 Web 應用程式存檔或 Web 應用程式資源檔案的縮寫,用於儲存 Java Web 應用程式的資源。 WAR 將所有 Web 元件打包成一個單元。它包含 JAR 檔案、JavaServer Pages、Java servlet、Java 類別檔案、XML 檔案、HTML 檔案以及 Web 應用程式所需的其他資源。
在本教程中,我們將展示如何使用 CLI 呼叫 WAR 檔案中的類別。
2. WAR 文件的結構
WAR 檔案使用.war
副檔名並打包我們可以在任何 Servlet/JSP 容器上部署的 Web 應用程式。
以下是典型 WAR 檔案結構的範例佈局:
META-INF/
MANIFEST.MF
WEB-INF/
web.xml
jsp/
helloWorld.jsp
classes/
com/baeldung/*.class
application.properties
static/
templates/
lib/
// third party *.jar files as libs
index.html
裡面有一個META-INF
目錄,其中包含有關網路檔案的MANIFEST.MF
中的有用資訊。 META-INF
目錄是私有的,外部無法存取。
WEB-INF
目錄是一個特殊的目錄,其中包含所有部署資訊和應用程式程式碼。 WEB-INF/classes
和WEB-INF/lib
目錄分別包含 Java 類別檔案和 JAR 函式庫。 WAR 檔案還包含所有靜態 Web 資源,包括 HTML 頁面、圖片和 JS 檔案。
3. 在 WAR 檔案中運行類
讓我們看一下透過命令列從 WAR 檔案運行類別的不同方法。
3.1.使用帶有-classpath
選項的java
指令
Java 虛擬機器 (JVM) 在執行 Java 程式時使用 classpath 環境變數來定位和載入類別。它指定了 JVM 應該尋找和載入類別檔案的目錄、JAR 檔案和 ZIP 檔案的清單。
讓我們看看下面的java
指令來運行 WAR 及其輸出。我們也可以用-cp
來代替-classpath
選項:
java -classpath target/maven-generate-war/WEB-INF/classes:target/maven-generate-war/WEB-INF/lib/* com.baeldung.MavenGenerateWarApplication
上述命令執行主要方法,產生以下輸出,然後在完成後終止伺服器:
2025-01-26 23:46:02.332 INFO 46563 --- [ main] c.baeldung.MavenGenerateWarApplication : Starting MavenGenerateWarApplication using Java 23.0.1 on MacBook-Pro local with PID 46563
2025-01-26 23:46:02.334 INFO 46563 --- [ main] c.baeldung.MavenGenerateWarApplication : No active profile set, falling back to 1 default profile: "default"
2025-01-26 23:46:02.782 INFO 46563 --- [ main] c.baeldung.MavenGenerateWarApplication : Started MavenGenerateWarApplication in 0.766 seconds (JVM running for 1.064)
3.2.使用java
命令和jar
選項
我們也可以使用 Spring Boot 建立 WAR 文件,直接在應用程式內包含嵌入式伺服器(如 Tomcat)。我們不需要將 WAR 檔案部署到外部 servlet 容器(例如 Apache Tomcat)。 WAR 包含執行應用程式所需的一切,包括伺服器。
我們已將MavenGenerateWarApplication
類別指定為pom.xml
中的mainClass
。現在,我們將執行以下命令來運行 WAR 檔案:
java -jar target/war-with-main-class.war
執行上述命令將運行MavenGenerateWarApplication
類,啟動伺服器並保持其運作。我們將看到以下輸出,表明 Spring Boot 應用程式已啟動:
2025-01-26 01:25:19.762 INFO 99652 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2025-01-26 01:25:19.763 INFO 99652 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.74]
2025-01-26 01:25:20.256 INFO 99652 --- [ main] oaccC[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2025-01-26 01:25:20.256 INFO 99652 --- [ main] wscServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1009 ms
2025-01-26 01:25:20.378 INFO 99652 --- [ main] osbawsWelcomePageHandlerMapping : Adding welcome page template: index
2025-01-26 01:25:20.450 INFO 99652 --- [ main] osbwembedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2025-01-26 01:25:20.455 INFO 99652 --- [ main] c.baeldung.MavenGenerateWarApplication : Started MavenGenerateWarApplication in 1.575 seconds (JVM running for 1.834)
4. 結論
在本文中,我們討論了透過 Java 命令列運行 WAR 檔案的不同方法。
使用java -jar
運行 WAR 檔案是運行使用嵌入式伺服器的現代 Web 應用程式的最佳選擇。另一方面, java -classpath
更適合執行非 Web 元件而不需要 servlet 容器。
與往常一樣,本文中使用的程式碼可以在 GitHub 上找到。