jar、war、pom
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>
三者的核心区别
| 特性 | 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:如果未指定 <packaging>,默认是什么?
默认是 jar,因此普通 Java 项目通常省略此配置。
Q2:能否在一个项目中同时生成 JAR 和 WAR?
不能直接实现,但可通过以下方式变通:
-
使用 Maven Assembly Plugin 定制多格式打包。
-
创建两个子模块:一个生成 JAR,另一个生成 WAR。
Q3:pom 类型的项目能否有代码?
可以有代码,但 不建议。pom 项目应仅用于配置管理,代码应放在子模块中。
Q4:如何将父项目的依赖传递给子模块?
在父 POM 中使用 <dependencies> 声明依赖,子模块通过 <parent> 继承;
或使用 <dependencyManagement> 统一管理版本,子模块显式引用。
总结
-
jar:普通 Java 项目的默认选择,生成库或可执行应用。 -
war:Web 应用的专属打包方式,适配 Servlet 容器。 -
pom:多模块项目的核心枢纽,集中管理配置和依赖。
根据项目类型合理选择<packaging>,是 Maven 高效构建的关键!
相关文章:
jar、war、pom
1. <packaging>jar</packaging> 定义与用途 用途:默认打包类型,生成 JAR 文件(Java Archive),适用于普通 Java 应用或库。 场景: 开发工具类库(如 commons-lang.jar)。…...
WSL2安装过程记录
WSL2安装过程记录 1 先决条件2 安装WSL3 安装Linux4 图形化界面 因为命令安装的时候会直接将linux发行版安装到C盘,对于系统盘容量小和介意不能自定义安装位置的用户来说,非常不友好,所以我这里采用手动安装的方式, 命令安装可以参…...
HTML列表,表格和表单
列表 在 HTML 中,列表(List)是常见的一种布局方式。列表分为两种类型:有序列表(Ordered List)和无序列表(Unordered List)。 无序列表 无序列表(Unordered List&#…...
Mysql进阶篇
存储引擎 Mysql体系结构 1). 连接层 最上层是一些客户端和链接服务,包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全…...
Spring-JAVA
针对你的问题(211本科、Java开发方向),以下是中级Java开发工程师的晋升时间、薪资水平及技术要求的详细说明,结合国内一线/二线城市现状(数据基于2023年行业调研): 一、晋升中级开发工程师的时间…...
sql的索引与性能优化相关
之前面试的时候,由于在简历上提到优化sql代码,老是会被问到sql索引和性能优化问题,用这个帖子学习记录一下。 1.为什么要用索引 ------------------------------------------------------------------------------------------------------…...
【Git版本控制器】第四弹——分支管理,合并冲突,--no-ff,git stash
🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 相关笔记: https://blog.csdn.net/djd…...
Elasticsearch除了用作查找以外,还能可以做什么?
前言 Elasticsearch用于实时数据分析、日志存储、业务智能等。还有日志与监控、多租户和安全性。以及应用场景包括日志分析、公共数据采集、全文搜索、事件数据、数据可视化。处理错误拼写和支持变体,不过这些可能还是属于搜索优化。企业搜索、日志管理、应用监控、…...
Gradio全解11——使用transformers.agents构建Gradio UI(6)
大模型WebUI:Gradio全解11——使用transformers.agents构建Gradio UI(6) 前言本篇摘要11. 使用transformers.agents构建Gradio UI11.6 通过agents构建Gradio UI11.6.1 ChatMessage数据类1. 数据结构2. 例程11.6.2 构建Gradio UI示例1. 代码及运行2. 代码解读参考文献前言 本…...
自定义实现简版状态机
状态机(State Machine)是一种用于描述系统行为的数学模型,广泛应用于计算机科学、工程和自动化等领域。它通过定义系统的状态、事件和转移来模拟系统的动态行为。 基本概念 状态(State):系统在某一时刻的特…...
算法常见八股问题整理
1.极大似然估计和交叉熵有什么关系 在分类问题中,当我们使用softmax函数作为输出层时,最大化对数似然函数实际上等价于最小化交叉熵损失函数。具体来说,在多分类情况下,最大化该样本的对数似然等价于最小化该样本的交叉熵损失。 交…...
关于GeoPandas库
geopandas buildings gpd.read_file(shapefile_path) GeoDataFrame 对象有一个属性叫做 sindex 空间索引通常是基于 R-树 或其变体构建的,这些数据结构专为空间查询优化,可以显著提高查询效率,尤其是在处理大型数据集时。 buildings_sin…...
【漫话机器学习系列】103.学习曲线(Learning Curve)
学习曲线(Learning Curve)详解 1. 什么是学习曲线? 学习曲线(Learning Curve)是机器学习和深度学习领域中用于评估模型性能随训练过程变化的图示。它通常用于分析模型的学习能力、是否存在过拟合或欠拟合等问题。 从…...
电商运营中私域流量的转化与变现:以开源AI智能名片2+1链动模式S2B2C商城小程序为例
摘要 电商运营的核心目标在于高效地将产品推向市场,实现私域流量的转化和变现。本文以“罗辑思维”的电商实践为背景,探讨了私域流量变现的重要性,并深入分析了开源AI智能名片21链动模式S2B2C商城小程序在电商运营中的应用与价值。通过该模式…...
Python常见面试题的详解19
1. 如何使用Django 中间件 Django 中间件宛如一个灵活且强大的插件系统,它为开发者提供了在请求处理流程的不同关键节点插入自定义代码的能力。这些节点包括请求抵达视图之前、视图完成处理之后以及响应即将返回给客户端之前。借助中间件,我们可以实现诸…...
Python 数据类型转换
目录 整数(int)与浮点数(float)之间的转换 (1)int():将浮点数或字符串转换为整数 (2)float():将整数或字符串转换为浮点数 字符串(str…...
进程概念、PCB及进程查看
文章目录 一.进程的概念进程控制块(PCB) 二.进程查看通过指令查看进程通过proc目录查看进程的cwd和exe获取进程pid和ppid通过fork()创建子进程 一.进程的概念 进程是一个运行起来的程序,而程序是存放在磁盘的,cpu要想执行程序的指…...
PyEcharts 数据可视化:从入门到实战
一、PyEcharts 简介 PyEcharts 是基于百度开源可视化库 ECharts 的 Python 数据可视化工具,支持生成交互式的 HTML 格式图表。相较于 Matplotlib 等静态图表库,PyEcharts 具有以下优势: 丰富的图表类型(30)动态交互功…...
RT-Thread+STM32L475VET6——ADC采集电压
文章目录 前言一、板载资源二、具体步骤1.打开CubeMX进行配置1.1 使用外部高速时钟,并修改时钟树1.2 打开ADC1的通道3,并配置为连续采集模式(ADC根据自己需求调整)1.3 打开串口1.4 生成工程 2. 配置ADC2.1 打开ADC驱动2.2 声明ADC2.3 剪切stm…...
easyexcel 2.2.6版本导出excel模板时,标题带下拉框及其下拉值过多不显示问题
需求背景:有一个需求要做下拉框的值有100多条,同时这个excel是一个多sheet的导入模板 直接用easyexcel 导出,会出现下拉框的值过多,导致生成出来的excel模板无法正常展示下拉功能 使用的easyexcel版本:<depende…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
