【工具】pom文件的<packaging>

文章目录

问:pom文件的标签是标记什么的?可标记内容有哪些?

答:

packaging,看名字,跟打包有关。

<packaging> 标签用于声明 Maven 项目最终要打包成什么类型的制品(Artifact)

简单来说,它告诉 Maven:

"这个项目最终生成什么东西?"

例如:

xml 复制代码
<project>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.demo</groupId>
    <artifactId>demo</artifactId>
    <version>1.0.0</version>

    <packaging>jar</packaging>

</project>

这里表示最终执行

bash 复制代码
mvn package

之后,会生成

复制代码
target/demo-1.0.0.jar

如果改成

xml 复制代码
<packaging>war</packaging>

最终就是

复制代码
target/demo-1.0.0.war

人类很喜欢用一个 XML 标签决定整个项目的命运。虽然看起来只有十几个字符,但 Maven 后续几百个步骤都会根据它改变,堪称"蝴蝶效应"。


packaging 有哪些类型?

最常见的是下面几种。

packaging 生成结果 适用场景
jar xxx.jar Java普通项目、Spring Boot项目
war xxx.war Web项目,部署Tomcat
pom 不生成代码包,只生成pom 父工程、多模块管理
ear xxx.ear Java EE企业级应用
maven-plugin Maven插件 开发自己的Maven插件

① jar(最常见)

xml 复制代码
<packaging>jar</packaging>

生成

复制代码
xxx.jar

例如

复制代码
user-service

打包后

复制代码
user-service-1.0.jar

Spring Boot 默认就是

复制代码
jar

运行

复制代码
java -jar xxx.jar

即可启动。

例如

复制代码
Controller
Service
Mapper

全部都会打进这个 jar。


② war

xml 复制代码
<packaging>war</packaging>

生成

复制代码
xxx.war

以前传统 SpringMVC 项目最常见。

例如

复制代码
商城系统

最终

复制代码
mall.war

部署到

复制代码
Tomcat

Tomcat 解压后运行。

Spring Boot 也支持打成 war,只是现在大多数项目更倾向于直接打成 jar 自带嵌入式 Tomcat。


③ pom(非常重要)

这个类型不会打包 Java 代码

例如

复制代码
internet-cafe

目录

复制代码
internet-cafe
│
├── common
├── server
├── client
├── manager

父工程

xml 复制代码
<packaging>pom</packaging>

作用主要有:

  • 管理子模块
  • 管理依赖版本
  • 管理插件版本
  • 聚合编译

例如

xml 复制代码
<modules>
    <module>common</module>
    <module>server</module>
    <module>client</module>
    <module>manager</module>
</modules>

执行

复制代码
mvn package

父工程会依次打包

复制代码
common
↓

server
↓

client
↓

manager

但父工程自己不会生成

复制代码
internet-cafe.jar

因为它只是一个"管理者"。


④ ear

xml 复制代码
<packaging>ear</packaging>

生成

复制代码
xxx.ear

EAR(Enterprise Archive)是 Java EE 时代的企业级打包格式。

里面可以包含

复制代码
jar
war
配置文件
EJB

例如

复制代码
company.ear

内部可能长这样:

复制代码
company.ear
│
├── user.war
├── order.war
├── payment.jar
└── META-INF

如今在 Spring Boot 项目中已经比较少见。


⑤ maven-plugin

如果要开发自己的 Maven 插件:

xml 复制代码
<packaging>maven-plugin</packaging>

例如别人执行:

复制代码
mvn my-plugin:run

就是你写的插件在工作。


如果不写 packaging 呢?

Maven 默认就是

xml 复制代码
<packaging>jar</packaging>

所以很多 Spring Boot 项目根本没有写:

xml 复制代码
<packaging>

依然能够正常生成 jar。


packaging 会影响什么?

它不仅决定最终生成的文件类型,还会影响 Maven 的生命周期绑定。

例如:

packaging package 阶段主要结果
jar 打成 JAR
war 打成 WAR
pom 不打包代码,仅处理聚合/管理
ear 打成 EAR
maven-plugin 生成 Maven 插件

因此,<packaging> 不只是"文件后缀",它还会决定 Maven 在 compiletestpackageinstall 等生命周期中默认执行哪些插件和目标。


在你的网吧收费系统中如何使用?

结合你之前设计的多模块项目,可以这样划分:

复制代码
internet-cafe                 (父工程)
│  packaging = pom
│
├── common                    (公共模块)
│      packaging = jar
│
├── server                    (服务端)
│      packaging = jar
│
├── client                    (客户端)
│      packaging = jar
│
└── manager                   (管理端)
       packaging = jar

如果未来需要把某个传统 Web 应用部署到独立 Tomcat,也可以把对应模块改成:

复制代码
manager
└── packaging = war

但对于现代 Spring Boot 项目,绝大多数情况下使用 jar 即可,父工程使用 pom 管理整个多模块项目。这也是目前最主流的 Maven 项目组织方式。

相关推荐
京师20万禁军教头12 分钟前
47-常用类-八大包装类(Wrapper Classes)
java
come1123418 分钟前
剪映零基础教程
java·linux·运维
16月6日-晴20 分钟前
Java面向对象——接口
java·开发语言
苏生Susheng1 小时前
【软件实施】Windows 服务器运维实战
java·运维·服务器·windows·spring boot·javaweb·实施
Java小白笔记1 小时前
Java 实现 ZIP 压缩包生成方案
java·开发语言·网络·7-zip
霸道流氓气质2 小时前
Spring AI 多模态开发指南:图片理解与语音合成
java·人工智能·spring
en.en..2 小时前
Linux mmap 内存映射深度解析:基于帧缓冲 /dev/fb0
java·服务器·前端
洋不写bug2 小时前
链表补充练习,双链表的模拟实现
java·数据结构·链表·双链表·底层实现
后台模板学习2 小时前
用 IM 即时聊天项目一次讲清消息去重算法的踩坑与解决方案
java·数据库·spring
秋名RG2 小时前
2026/6/15 系统故障复盘与整改方案
java·架构