1. <packaging>jar</packaging>
定义与用途
-
用途:默认打包类型,生成 JAR 文件(Java Archive),适用于普通 Java 应用或库。
-
场景:
关键行为
-
构建流程:
-
执行
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 高效构建的关键!