jar、war、pom

news/2025/2/25 0:04:04

1. <packaging>jar</packaging>

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

  • 场景

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

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

关键行为
  • 构建流程

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

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

  • 依赖处理

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

配置示例
<project>
  <groupId>com.example</groupId>
  <artifactId>my-java-app</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging> <!-- 默认值,可省略 -->

  <!-- 定义可执行 JAR 的主类 -->
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <mainClass>com.example.Main</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

2. <packaging>war</packaging>

定义与用途
  • 用途:生成 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
配置示例
<project>
  <groupId>com.example</groupId>
  <artifactId>my-webapp</artifactId>
  <version>1.0.0</version>
  <packaging>war</packaging> <!-- 必须显式声明 -->

  <dependencies>
    <!-- Servlet API 依赖 -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope> <!-- 容器提供,不打包进 WAR -->
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.3.2</version>
        <configuration>
          <warSourceDirectory>src/main/webapp</warSourceDirectory> <!-- 指定 Web 资源目录 -->
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

3. <packaging>pom</packaging>

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

  • 场景

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

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

关键行为
  • 构建流程

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

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

  • 多模块配置

    plaintext

    复制

    parent-project (packaging=pom)
    ├── module-common (packaging=jar)
    ├── module-web (packaging=war)
    └── module-api (packaging=jar)
配置示例
<!-- 父项目 pom.xml -->
<project>
  <groupId>com.example</groupId>
  <artifactId>parent-project</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging> <!-- 关键配置 -->

  <!-- 定义子模块 -->
  <modules>
    <module>module-common</module>
    <module>module-web</module>
    <module>module-api</module>
  </modules>

  <!-- 公共依赖管理 -->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <!-- 公共插件配置 -->
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.1</version>
          <configuration>
            <source>11</source>
            <target>11</target>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

三者的核心区别

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

常见问题解答

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

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

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

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

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

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

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

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

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

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


总结

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

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

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


http://www.niftyadmin.cn/n/5864868.html

相关文章

《AI赋能星际探索:机器人如何开启宇宙新征程!》

在人类对宇宙无尽的探索中&#xff0c;空间探索任务始终充满挑战。从遥远星球的探测&#xff0c;到空间站的维护&#xff0c;每一项任务都需要高精度、高可靠性的操作。人工智能&#xff08;AI&#xff09;的迅猛发展&#xff0c;为空间探索机器人带来了革命性的变革&#xff0…

解决每次 Maven Rebuild 后 Java 编译器版本变为 1.5

解决方法 明确指定 Java 编译版本 在 pom.xml 中添加 maven-compiler-plugin 配置&#xff0c;明确指定 Java 编译版本为 1.8。可以在 标签内添加以下内容&#xff1a; <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId>&…

deepseek AI写的对动态地址的linux执行文件的加壳

我开始思考如何逐步完善程序中的各个部分。首先&#xff0c;在shell. c文件中&#xff0c;有一些未定义的部分&#xff0c;如TARGET入口地址、GOT表地址等。这些需要通过调试工具&#xff08;比如gdb&#xff09;获取&#xff0c;并在代码中标明。此外&#xff0c;shellcode数组…

深度学习-7.超参数优化

Deep Learning - Lecture 7 Hyperparameter Optimization 简介超参数搜索用于超参数选择的贝叶斯优化启发性示例贝叶斯优化 引用 本节目标&#xff1a; 解释并实现深度学习中使用的不同超参数优化方法&#xff0c;包括&#xff1a; 手动选择网格搜索随机搜索贝叶斯优化 简介 …

DDD - 整洁架构

DDD&#xff08;领域驱动设计&#xff09;的整洁架构&#xff08;Clean Architecture&#xff09;是一种通过分层和依赖规则&#xff0c;确保领域模型&#xff08;业务逻辑&#xff09;与技术实现解耦的架构模式。其核心目标是让业务逻辑成为系统的核心&#xff0c;而技术细节&…

PH热榜 | 2025-02-23

1. NYX 标语&#xff1a;你智能化的营销助手&#xff0c;助你提升业绩。 介绍&#xff1a;NYX的人工智能助手简化了从头到尾的广告活动管理&#xff0c;帮助你轻松创建高转化率的广告&#xff0c;启动多渠道营销活动&#xff0c;并通过实时分析来优化表现。它还可以整合主要的…

【网络编程】广播和组播

数据包发送方式只有一个接受方&#xff0c;称为单播。如果同时发给局域网中的所有主机&#xff0c;称为广播。只有用户数据报(使用UDP协议)套接字才能广播&#xff1a; 广播地址以192.168.1.0 (255.255.255.0) 网段为例&#xff0c;最大的主机地址192.168.1.255代表该网段的广…

设计模式| 观察者模式 Observer Pattern详解

目录 一、概述1.1 动机1.2 核心思想1.3 别名 二、角色与实现原理2.1 角色2.2 实现原理2.3 类图 三、经典接口实现3.1 示例3.1.1 观察者接口3.1.2 目标接口3.1.3 具体被观察者3.1.4 具体观察者3.1.5 Client3.1.6 UML时序图 3.2 特点 四、其他实现方式4.1 委托与事件&#xff08;…