通过命令行执行 WAR 包

1、概览

WAR 文件是 Web 应用程序归档文件(Web Application Archive)或 Web 应用程序资源文件(Web Application Resource)的简称,用于存储 Java Web 应用程序的资源。WAR 将所有 Web 组件打包成一个单元。它包含 JAR 文件、JavaServer Page(JSP)Java ServletJava 类文件、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/classesWEB-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