1. 概述

WAR文件(Web Application Archive)是Java Web应用的归档格式,用于打包Web应用的所有资源。它将Web组件(如Servlet、JSP)和静态资源整合为单一单元,包含JAR文件、Java类文件、XML配置、HTML页面等。

本文将介绍如何通过命令行调用WAR文件中的Java类。

2. WAR文件的结构

WAR文件使用.war扩展名,可部署在任何Servlet/JSP容器上。

典型WAR文件结构示例:

META-INF/
    MANIFEST.MF
WEB-INF/
    web.xml
    jsp/
        helloWorld.jsp
    classes/
        com/baeldung/*.class
        application.properties        
        static/        
        templates/
    lib/
        // 第三方库文件(*.jar)
index.html

关键目录说明:

  • META-INF:私有目录,包含归档元信息(如MANIFEST.MF)
  • WEB-INF:特殊目录,包含:
    • classes:存放编译后的Java类文件
    • lib:存放依赖的JAR库
    • web.xml:部署描述符
  • 根目录:静态资源(HTML、图片等)

3. 运行WAR文件中的类

3.1. 使用java命令的-classpath选项

JVM通过classpath定位和加载类,它指定了类文件的搜索路径(目录/JAR/ZIP文件)。

执行命令示例(Linux/macOS语法):

java -classpath target/maven-generate-war/WEB-INF/classes:target/maven-generate-war/WEB-INF/lib/* com.baeldung.MavenGenerateWarApplication

⚠️ 路径分隔符说明:

  • Linux/macOS:冒号(:)
  • Windows:分号(;)

3.2. 使用java命令的-jar选项

Spring Boot构建的WAR文件可包含嵌入式服务器(如Tomcat),无需外部Servlet容器即可运行。

前提条件:在pom.xml中指定了主类(如MavenGenerateWarApplication)。

执行命令:

java -jar target/war-with-main-class.war

输出示例:

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. 结论

两种方案对比:

场景 推荐方案 特点
现代Web应用(嵌入式服务器) java -jar ✅ 简单粗暴,包含完整运行环境
非Web组件/工具类 java -classpath ✅ 无需Servlet容器,轻量级

踩坑提醒:

  • 确保classpath包含所有依赖(尤其WEB-INF/lib/*
  • 主类路径需与实际包结构一致(如com.baeldung.Xxx
  • Windows用户注意路径分隔符使用分号(;)