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
中,供其他项目引用。
- 依赖的 JAR 不会被打包进去,但会记录在
配置示例
<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 高效构建的关键!