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

相关推荐
l156469481 小时前
突围!图文混合知识库难以解析,Kimi-K3 原生视觉架构深耕知识工作,DMXAPI 统一接口,缩短项目开发周期
java·大数据·开发语言
布吉岛的石头2 小时前
Java 程序员第 45 阶段11:网关统一路由大模型接口,配合 Nacos 配置治理,灰度路由:基于Nacos元数据实现大模型服务灰度发布与权重路由
java·服务发现
我命由我123453 小时前
Android 开发问题:Cannot resolve method ‘repeat‘ in ‘String‘
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
baozhengw3 小时前
信创改造-SpringBootJar包改为WAR包部署Tomcat
java·tomcat
M1A14 小时前
基于 Spring AOP 构建系统操作日志:从注解设计到异步落库的完整实战
java
RainCity4 小时前
Java Swing 自定义组件库分享(十五)
java·笔记·后端
farerboy4 小时前
23-Java 构造函数
java·后端
坚持的小马4 小时前
Rocketmq搭建操作步骤
java·rocketmq·java-rocketmq
砚底藏山河4 小时前
多家股票数据接口对比、企业级股票数据API
java·python·金融·maven