【工具】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 项目组织方式。

相关推荐
程序员黑豆6 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
风流 少年7 小时前
Spring AI 2.0:Memory
java·后端·spring
码匠许师傅7 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
小席是个热心肠8 小时前
AI相关的自我学习
java·人工智能·学习
数智化管理手记10 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能
cfm_291411 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
鲸采云SRM采购管理系统12 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库
0x5313 小时前
Java网络编程(二)
java·服务器·网络
Flittly13 小时前
【雕虫大技】Agent 动态 Skill 供应链安全加固(三):输出校验与治理闭环实战
java·spring boot·spring
Poo_Chai13 小时前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库