jar、war、pom


1. jar

定义与用途
  • 用途:默认打包类型,生成 JAR 文件(Java Archive),适用于普通 Java 应用或库。

  • 场景

    • 开发工具类库(如 commons-lang.jar)。

    • 构建可执行应用(通过 java -jar 运行)。

关键行为
  • 构建流程

    • 执行 mvn package 后,生成 target/<项目名>.jar

    • 包含编译后的 .class 文件、资源文件(如 .properties)和 META-INF/MANIFEST.MF

  • 依赖处理

    • 依赖的 JAR 不会被打包进去,但会记录在 pom.xml 中,供其他项目引用。

配置示例

  com.example
  my-java-app
  1.0.0
  jar 

  
  
    
      
        org.apache.maven.plugins
        maven-jar-plugin
        
          
            
              com.example.Main
            
          
        
      
    
  


2. war

定义与用途
  • 用途:生成 WAR 文件(Web Application Archive),用于部署 Web 应用到 Servlet 容器(如 Tomcat)。

  • 场景

    • 开发基于 Servlet、JSP 或 Spring MVC 的 Web 应用。

    • 需要包含前端资源(HTML/CSS/JS)和后端逻辑。

关键行为
  • 构建流程

    • 执行 mvn package 后,生成 target/<项目名>.war

    • 自动将依赖的 JAR 包复制到 WEB-INF/lib 目录。

    • 包含 WEB-INF/web.xml(可选,Servlet 3.0+ 支持注解配置)。

  • 目录结构

    plaintext

    复制

    my-webapp.war
    ├── WEB-INF/
    │   ├── classes/       # 编译后的 .class 文件
    │   ├── lib/           # 依赖的 JAR 文件
    │   └── web.xml        # Web 应用配置
    ├── index.jsp          # JSP 页面
    └── static/
        ├── style.css
        └── script.js
配置示例

  com.example
  my-webapp
  1.0.0
  war 

  
    
    
      javax.servlet
      javax.servlet-api
      4.0.1
      provided 
    
  

  
    
      
        org.apache.maven.plugins
        maven-war-plugin
        3.3.2
        
          src/main/webapp 
        
      
    
  


3. pom

定义与用途
  • 用途:表示项目本身 不生成任何构件(如 JAR/WAR),而是作为 父项目 或 聚合项目,用于管理子模块。

  • 场景

    • 多模块项目中,父 POM 集中管理公共依赖和插件。

    • 聚合多个子项目,统一构建(如 mvn install 一键构建所有子模块)。

关键行为
  • 构建流程

    • 执行 mvn package 时,不会生成 JAR/WAR 文件。

    • 主要用于继承配置()或聚合模块()。

  • 多模块配置

    plaintext

    复制

    parent-project (packaging=pom)
    ├── module-common (packaging=jar)
    ├── module-web (packaging=war)
    └── module-api (packaging=jar)
配置示例


  com.example
  parent-project
  1.0.0
  pom 

  
  
    module-common
    module-web
    module-api
  

  
  
    
      
        junit
        junit
        4.12
        test
      
    
  

  
  
    
      
        
          org.apache.maven.plugins
          maven-compiler-plugin
          3.8.1
          
            11
            11
          
        
      
    
  


三者的核心区别

特性 jar war pom
输出产物 .jar 文件 .war 文件 无产物(仅配置)
适用场景 普通 Java 应用或库 Web 应用 多模块项目或父项目管理
依赖打包 依赖不打包,仅记录在 pom.xml 依赖 JAR 打包到 WEB-INF/lib 不涉及依赖打包
Maven 生命周期 执行 package 生成 JAR 执行 package 生成 WAR 仅管理配置,不执行打包
配置文件 META-INF/MANIFEST.MF WEB-INF/web.xml 无特殊文件,仅 pom.xml

常见问题解答

Q1:如果未指定 ,默认是什么?

默认是 jar,因此普通 Java 项目通常省略此配置。

Q2:能否在一个项目中同时生成 JAR 和 WAR?

不能直接实现,但可通过以下方式变通:

  1. 使用 Maven Assembly Plugin 定制多格式打包。

  2. 创建两个子模块:一个生成 JAR,另一个生成 WAR。

Q3:pom 类型的项目能否有代码?

可以有代码,但 不建议pom 项目应仅用于配置管理,代码应放在子模块中。

Q4:如何将父项目的依赖传递给子模块?

在父 POM 中使用  声明依赖,子模块通过  继承;
或使用  统一管理版本,子模块显式引用。


总结

  • jar:普通 Java 项目的默认选择,生成库或可执行应用。

  • war:Web 应用的专属打包方式,适配 Servlet 容器。

  • pom:多模块项目的核心枢纽,集中管理配置和依赖。
    根据项目类型合理选择 ,是 Maven 高效构建的关键!

你可能感兴趣的:(jar,java)