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 高效构建的关键!