前面写了一篇关于Maven构建项目相关一揽子知识,侧重于各种常见报错的排查和pom.xml的配置。本文作为补充,从实操角度记录一次完整的Maven Web项目构建过程。

环境准备

# JDK版本确认
java -version
# openjdk version "1.8.0_231"

# Maven版本确认
mvn -version
# Apache Maven 3.6.3

# Tomcat版本
# Apache Tomcat 8.5.50

Maven换源

国内环境建议配置阿里云镜像源,避免依赖下载超时:

<!-- ~/.m2/settings.xml 或 Maven安装目录/conf/settings.xml -->
<mirrors>
    <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

项目构建流程

1x01 导入项目

以IDEA为例,打开Maven项目时选择pom.xml文件导入:

File -> Open -> 选择 pom.xml -> Open as Project

IDEA会自动解析pom.xml中的依赖配置并下载jar包到本地仓库~/.m2/repository/

1x02 常见构建命令

# 仅编译
mvn compile

# 运行单元测试
mvn test

# 打包(跳过测试)
mvn clean package -DskipTests

# 安装到本地仓库
mvn install -DskipTests

# 查看依赖树
mvn dependency:tree

# 查看Effective POM(包含继承、插值后的完整pom)
mvn help:effective-pom

1x03 部署到Tomcat

# 打包后获取war文件
mvn clean package -DskipTests
# target/xxx.war

# 复制到Tomcat webapps目录
cp target/xxx.war /path/to/tomcat/webapps/

# 启动Tomcat
cd /path/to/tomcat/bin
./startup.sh    # Linux/macOS
.\startup.bat   # Windows

# 验证部署
curl -I http://localhost:8080/xxx/

依赖冲突排查

Maven项目最常见的问题就是依赖冲突,尤其是安全工具场景下引用多个POC项目时:

# 查看依赖树,过滤冲突
mvn dependency:tree -Dverbose -Dincludes=commons-collections

# 常见冲突解决方式:排除冲突依赖
<dependency>
    <groupId>com.example</groupId>
    <artifactId>example-lib</artifactId>
    <version>1.0.0</version>
    <exclusions>
        <exclusion>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
        </exclusion>
    </exclusions>
</dependency>

本地jar包安装到仓库

在安全研究中经常需要将本地编译的jar安装到Maven仓库:

# 安装本地jar到本地仓库
mvn install:install-file \
    -Dfile=/path/to/target.jar \
    -DgroupId=com.example \
    -DartifactId=target \
    -Dversion=1.0.0 \
    -Dpackaging=jar

# pom.xml中引用
<dependency>
    <groupId>com.example</groupId>
    <artifactId>target</artifactId>
    <version>1.0.0</version>
</dependency>

FAQ

依赖下载失败

# 强制更新依赖
mvn clean install -U

# 跳过校验
mvn clean install -DskipTests -Dmaven.javadoc.skip=true

IDEA构建后找不到war包

检查Project Structure -> Artifacts是否正确配置了Web Application Archive。

编码问题

<!-- pom.xml中指定编码 -->
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
</properties>

更多报错场景和解决方案,详见:Maven构建项目相关一揽子知识

以上。