文章目录
- 问:pom文件的<packaging>标签是标记什么的?可标记内容有哪些?
- 答:
- [packaging 有哪些类型?](#packaging 有哪些类型?)
-
- [① jar(最常见)](#① jar(最常见))
- [② war](#② war)
- [③ pom(非常重要)](#③ pom(非常重要))
- [④ ear](#④ ear)
- [⑤ maven-plugin](#⑤ maven-plugin)
- [如果不写 packaging 呢?](#如果不写 packaging 呢?)
- [packaging 会影响什么?](#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 在 compile、test、package、install 等生命周期中默认执行哪些插件和目标。
在你的网吧收费系统中如何使用?
结合你之前设计的多模块项目,可以这样划分:
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 项目组织方式。