通过命令行执行 WAR 包
1、概览
WAR 文件是 Web 应用程序归档文件(Web Application Archive)或 Web 应用程序资源文件(Web Application Resource)的简称,用于存储 Java Web 应用程序的资源。WAR 将所有 Web 组件打包成一个单元。它包含 JAR 文件、JavaServer Page(JSP)、Java Servlet、Java 类文件、XML 文件、HTML 文件以及 Web 应用程序所需的其他资源。
本文将带你了解如何使用 CLI 调用在 WAR 文件中的类。
2、WAR 文件的结构
WAR 文件使用 .war
扩展名并打包 Web 应用程序,我们可以将其部署到任何 Servlet/JSP 容器上。
下面是一个典型的 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
中保存了有关 Web 存档的有用信息。META-INF
目录是私有的,外部无法访问。
WEB-INF
目录是一个特殊目录,包含所有部署信息和应用程序代码。WEB-INF/classes
和 WEB-INF/lib
目录分别包含 Java 类文件和 JAR 库。WAR 文件还包含所有静态网络资源,包括 HTML 页面、图像和 JS 文件。
3、运行 WAR
3.1、使用 java -classpath 命令
运行 Java 程序时,Java 虚拟机 (JVM) 会使用 classpath 环境变量来定位和加载类。它指定了 JVM 查找和加载类文件的目录、JAR 文件和 ZIP 文件列表。
执行如下命令来运行 WAR 中的 main
方法:
java -classpath target/maven-generate-war/WEB-INF/classes:target/maven-generate-war/WEB-INF/lib/* com.baeldung.MavenGenerateWarApplication
也可以使用
-cp
代替-classpath
选项。
输出如下,在完成后终止服务器:
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 文件部署到 Apache Tomcat 等外部 Servlet 容器。WAR 文件包含运行应用程序所需的一切,包括服务器。
在 pom.xml
中指定 MavenGenerateWarApplication
类为 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] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2025-01-26 01:25:20.256 INFO 99652 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1009 ms
2025-01-26 01:25:20.378 INFO 99652 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page template: index
2025-01-26 01:25:20.450 INFO 99652 --- [ main] o.s.b.w.embedded.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
更适合在不需要 servlet 容器的情况下运行非 Web 组件。
Ref:https://www.baeldung.com/java-run-class-within-war-cli