信步漫谈之Maven——自定义结构打WAR包
1 目标
将项目编译完成的内容和本地的文件通过自定义的目录结构打包成war包。
2 程序结构
分为四个项目,packagewar-webapp、packagewar、demo01、demo02,其中后两者是空项目,只是为了作为jar包依赖使用。
packagewar 是 pom 项目,用于执行 maven package 打包,打包完成后将在 packagewar-webapp 的 target 目录下输出 WAR 包。
packagewar-webapp 是打 WAR 包的输出项目,包含自定义的 web 目录结构如下。
packagewar-webapp
∟ src
∟ main
∟ webapp
∟ WEB-INF
∟ lib
∟ debug
∟ deploy
∟ doc
∟ README.md
∟ lib
∟ log
∟ temp
∟ web.xml
∟ index.jsp
∟ pom.xml
3 Maven 的 POM 脚本
- demo01(demo02类似)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.alfred.maven</groupId>
<artifactId>maven-demo01</artifactId>
<version>1.0.0-SNAPSHOT</version>
<description>
概述:用于maven项目研究的demo
作用:可用于配合其他项目进行操作
</description>
</project>
- packagewar
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.alfred.maven</groupId>
<artifactId>maven-packagewar</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<description>
概述:【Maven技术研究】打war包
目标:作为总体编译打包的 pom 项目
</description>
<modules>
<module>../com.alfred.maven.demo01</module>
<module>../com.alfred.maven.demo02</module>
<module>../com.alfred.maven.packagewar-webapp</module>
</modules>
</project>
- packagewar-webapp
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.alfred.maven</groupId>
<artifactId>maven-packagewar-webapp</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>war</packaging>
<description>
概述:【Maven技术研究】打war包
目标:将项目编译完成的内容和本地的文件通过自定义的目录结构打包成war包
1)demo01 -> 存放在web前台的lib/debug/deploy目录下
2)demo02 -> 存放在web前台的lib/debug/lib目录下
3)packagewar-webapp -> 打包的web项目
4)保留web项目目录结构不变,集成打包成一个war包PackageWar.war
</description>
<dependencies>
<dependency>
<groupId>com.alfred.maven</groupId>
<artifactId>maven-demo01</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alfred.maven</groupId>
<artifactId>maven-demo02</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>auto-clean</id>
<phase>initialize</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.2</version>
<executions>
<!-- 拷贝lib包下的依赖jar包 -->
<execution>
<id>copy-lib-dependencies</id>
<!-- 在 test-compile 阶段执行 -->
<phase>test-compile</phase>
<goals>
<!-- 阶段目标指定为拷贝依赖 -->
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- 依赖包输出到编译路径下的自定义目录 -->
<outputDirectory>${project.build.directory}/${project.artifactId}/WEB-INF/lib/debug/lib/</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<includeArtifactIds>maven-demo02</includeArtifactIds>
</configuration>
</execution>
<!-- 拷贝deploy包下的依赖jar包 -->
<execution>
<id>copy-deploy-dependencies</id>
<phase>test-compile</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/${project.artifactId}/WEB-INF/lib/debug/deploy/</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<includeArtifactIds>maven-demo01</includeArtifactIds>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<!-- 项目输出目录 -->
<webappDirectory>${project.build.directory}/${project.artifactId}</webappDirectory>
<!-- WAR 包自定义名称 -->
<warName>PackageWar</warName>
<!-- 是否包含空目录,像日志 log、临时 temp 目录 -->
<includeEmptyDirectories>true</includeEmptyDirectories>
<!-- 默认情况下使用 maven-war-plugin 会将依赖的 jar 包都放在 lib 目录下,此处排除 -->
<packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
4 WAR包结构
PackageWar.war
∟ META-INF
∟ WEB-INF
∟ classes
∟ lib
∟ debug
∟ deploy
∟ maven-demo01-1.0.0-SNAPSHOT.jar
∟ doc
∟ README.md
∟ lib
∟ maven-demo02-1.0.0-SNAPSHOT.jar
∟ log
∟ temp
∟ web.xml
∟ index.jsp
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具