Maven 项目管理从入门到进阶:基础与高级实战全解析

一、Maven 基础篇:打好项目管理基石

1. Maven 简介

  • Maven 是什么:
    *

    Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
    POM(Project Object Model):项目对象模型

2. Maven 基础概念

1,仓库

仓库:用户存储资源,包含各种jar包。
在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。
仓库分类:
本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源。
远程仓库:非本机电脑上的仓库,为本地仓库提供资源。
中央仓库:Maven团队维护,存储所有资源的仓库。
私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源。
私服的作用:
保存具有版权的资源,包含购买或自主研发的jar。
中央仓库中的jar都是开源的,不能存储具有版权的资源。
一定范围内共享资源,仅对内部开放,不对外共享。

2,坐标

什么是坐标:
坐标:Maven中的坐标用于描述仓库中资源的位置。
Maven坐标的主要组成:
groupID:定义当前Maven项目隶属组织名称(通常是域名反写,例如:org.mybatis)
artifactID:定义当前Maven项目名称(通常是模块名称,例如CRM,SMS)
version:定义当前项目版本号,形式为 0.0.1 - SNAPSHOT:

第一个0代表大版本号,第二个0代表分支版本号,第三个0表示小版本号SHAPSHOT -- 快照版本,ALPHA -- 内测版本,BETA -- 公测版本,RELE ASE -- 稳定版本,GA -- 正式发布

packaging:打包的方式,如:pom,jar,war,maven-plugin...
Maven坐标的作用:
使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别和下载工作交由机器完成。

3. 生命周期与插件

项目构建生命周期

Maven对项目构建的生命周期划分为三套

1,clean:清理工作

2,default:核心工作,例如编译,测试,打包,部署等

如何要执行compile(编译)那么编译上面的都要先执行

如果要执行test(测试)那么测试上面的都要先执行

如果要执行install(安装)那么安装上面的都要先执行

3,site:产生报告,发布站点等

插件

插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能

默认maven在各个生命周期上绑定有预设的功能

通过插件可以自定义其他功能

XML 复制代码
<build>
  <plugins>
<!--   指定某个插件   -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-source-plugin</artifactId>
      <version>3.0.1</version>
      <executions>
        <execution>
          <goals>
            <goal>test-jar</goal>
          </goals>
          <phase>generate-test-resources</phase>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

4. 依赖管理

1,依赖传递

依赖具有传递性

直接依赖:在当前项目中通过依赖配置建立的依赖关系

间接依赖:被资源的资源如果依赖其他资源,当前项目间接依赖其他资源

依赖传递冲突问题

1,路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高。

2,声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的。

3,特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的。

2,可选依赖(依赖阻断)

可选依赖指对外隐藏当前所依赖的资源------不透明

XML 复制代码
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <!-- 用来指明是否不透明   -->
  <optional>true</optional>
</dependency>

3,排除依赖

排除依赖指主动断开依赖的资源,被排除的资源无需指定版本------不需要

XML 复制代码
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
    <!-- 用来指明排除哪个依赖   -->
  <exclusions>
    <exclusion>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </exclusion>
  </exclusions>
  
</dependency>

4,依赖范围

依赖的jar默认情况可以在任何地方使用,可以通过scope标签设定其作用范围

作用范围(classpath)

1,主程序范围有效(main文件夹范围内)

2,测试程序范围有效(test文件夹范围内)

3,是否参与打包(package指令范围内)运行时

依赖范围传递性

带有依赖范围的资源在进行进行传递时,作用范围将受到影响

二、Maven 高级篇:进阶项目管理能力

1. Maven 聚合和继承

1,聚合
作用:聚合用于快速构建maven工程,一次性构建多个项目/模块。
工程:
创建一个空模块,打包类型定义为pom

XML 复制代码
<packaging>pom</packaging>

定义当前模块进行构建操作时关联的其他模块名称

XML 复制代码
  <!--管理的工程列表-->
<modules>
    <!--具体的工程名称-->
  <module>hami_core</module>
  <module>hami_protal</module>
  <module>hami_console</module>
</modules>

注意:参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置的顺序无关。

2,继承

作用:通过继承可以实现在子工程中沿用父工程中的配置
maven中的继承与java中的继承相似,在子工程中配置继承关系
过程:
在子工程中声明其父工程坐标与对应的位置

XML 复制代码
<parent>
    <artifactId>hami_parent</artifactId>
    <groupId>com.qcby</groupId>
    <version>1.0-SNAPSHOT</version>
    <relativePath>../ssm/pom.xml</relativePath>
</parent>

在父工程中定义依赖管理

XML 复制代码
<!--此处声明依赖管理-->
<dependencyManagement>
    <!--具体依赖-->
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>
</dependencyManagement>

在子工程中定义依赖关系,无需声明依赖版本,版本参照父工程中依赖的版本

XML 复制代码
<dependencies>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
    </dependency>
</dependencies>

可以继承的元素(常用):


計注意:artifactId不可以继承,没有项目都要有自己的artifactId

3. 属性定义与使用

属性类别:自定义属性

作用:等同于定义变量,方便统一维护

定义:

XML 复制代码
<!--定义自定义属性--> <properties> <junit.version>4.12</junit.version> </properties>

调用:

XML 复制代码
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency>

属性类别:内置属性

作用:使用maven内置属性,快速配置

调用:

XML 复制代码
${basedir} ${version}

属性类别 :Settings属性

作用:使用maven配置文件setting.xml中的标签属性,用于动态配置

调用:

XML 复制代码
${settings.localRepository}

属性类别:环境变量属性

调用:

XML 复制代码
${env.JAVA_HOME}

环境变量属性查询方式

XML 复制代码
mvn help:system

4. 私服

Nexus

Nexus是Sonatype公司的一款maven私服产品。

仓库分类

  • 宿主仓库(hosted):
    • 保存无法从中央仓库获取的资源
      • 自主研发
      • 第三方开源项目
  • 代理仓库(proxy):
    • 代理远程仓库,通过nexus访问其他公共仓库,例如中央仓库
  • 仓库组group:
    • 将若干仓库组成一个群组,简化配置
    • 仓库组不能保存资源,属于设计型仓库

将项目发布到私服

  • 配置访问服务器的权限,用户名密码
XML 复制代码
// <servers>中的内容
<!-- 定义稳定版本的id,用户名,密码 -->
    <server>
      <id>releases</id>
      <username>admin</username>
      <password>admin123</password>
    </server>
    <!-- 定义开发版本的id,用户名,密码 -->
    <server>
      <id>snapshots</id>
      <username>admin</username>
      <password>admin123</password>
    </server>
XML 复制代码
配置私服仓库的地址,根据工程的版本号决定上传的宿主仓库,
如果版本为release则上传到私服的release仓库,如果版本为snapshot则上传到私服的snapshot仓库
根据url判断仓库
id要和settings中配置的id相同。

// pom文件中内容
<distributionManagement>
  <repository>
    <id>releases</id>
    <url>http://localhost:8079/nexus/content/repositories/releases/</url>
  </repository>
  <snapshotRepository>
    <id>snapshots</id>
    <url>http://localhost:8079/nexus/content/repositories/snapshots/</url>
  </snapshotRepository>
</distributionManagement>

从私服下载资源

  • 在settings.xml文件中配置镜像
XML 复制代码
// settings文件内容
<mirror>
      <!-- id名称 -->
      <id>nexusmaven</id>
      <!-- 表示拦截所有的请求,都重定向到私服,从私服下载jar包,私服没有去中央仓库下载 -->
      <mirrorOf>*</mirrorOf>
      <!-- 私服组地址 -->
      <url>http://localhost:8079/nexus/content/groups/public/</url>
    </mirror>
XML 复制代码
<!-- 下载jar的配置 -->
   <profile> 
      profile的id
      <id>dev</id>

      <repositories>
        <repository>
          仓库id,repositories可以配置多个仓库,保证id不重复
          <id>nexus</id>
          仓库地址,即nexus仓库组的地址
          <url>http://localhost:8079/nexus/content/groups/public/</url>
          是否下载releases构件
          <releases>
            <enabled>true</enabled>
          </releases>
          是否下载snapshots构件
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>
      </repositories>
      <pluginRepositories>
        插件仓库,maven的运行依赖插件,也需要从私服下载插件
        <pluginRepository>
          插件仓库的id不允许重复,如果重复后边配置会覆盖前边
          <id>public</id>
          <name>Public Repositories</name>
          <url>http://localhost:8079/nexus/content/groups/public/</url>
        </pluginRepository>
      </pluginRepositories>
    </profile>
XML 复制代码
// 激活环境
<activeProfiles>
    <activeProfile>dev</activeProfile>
 </activeProfiles>

第三方jar包发布到私服

  • 把jar包安装到本地仓库
XML 复制代码
mvn install:install-file -DgroupId=com.alibaba -DartifactId=fastjson
-Dversion=1.1.37 -Dfile=fastjson-1.1.37.jar -Dpackaging=jar
  • 把jar包上传到私服
    先在settings中配置server
XML 复制代码
    <!-- 定义第三方组件的id,用户名,密码 -->
    <server>
      <id>thirdparty</id>
      <username>admin</username>
      <password>admin123</password>
    </server>
XML 复制代码
// 上传到私服
mvn deploy:deploy-file 
-DgroupId=com.alibaba
-DartifactId=fastjson 
-Dversion=1.1.37 
-Dpackaging=jar
-Dfile=fastjson-1.1.37.jar
-Durl=http://localhost:8079/nexus/content/repositories/thirdparty/ 
-DrepositoryId=thirdparty

三、总结

至此,Maven的核心基础用法就全部讲解完毕了。从环境搭建到项目创建,从依赖管理到打包部署,Maven用"约定优于配置"的理念,帮我们解决了Java项目中依赖混乱、构建繁琐的问题,让开发流程更规范、效率更高。 对于新手来说,无需一开始就纠结复杂特性,先把"环境配置、POM文件、常用命令"这三大核心掌握,就能应对日常开发需求。多在实际项目中练习,遇到问题时优先检查配置文件和依赖情况,慢慢就能熟练驾驭。 希望这篇文章能帮你快速上手Maven,让它成为你开发路上的好帮手~ 如有疑问,欢迎在评论区交流!

相关推荐
小张快跑。6 分钟前
Maven指定版本下载以及相关配置
java·maven
zhishidi8 分钟前
Spring @Scheduled注解调度机制详解
java·python·spring
⑩-8 分钟前
Blocked与Wati的区别
java·开发语言
AAA简单玩转程序设计11 分钟前
救命!Java这3个小技巧,写起来爽到飞起✨
java
IManiy17 分钟前
Java表达式引擎技术选型分析(SpEL、QLExpress)
java·开发语言
历程里程碑25 分钟前
C++ 17异常处理:高效捕获与精准修复
java·c语言·开发语言·jvm·c++
雨雨雨雨雨别下啦27 分钟前
ssm复习总结
java·开发语言
计算机毕设指导61 小时前
基于微信小程序的校园物品租赁与二手交易系统【源码文末联系】
spring boot·mysql·微信小程序·小程序·tomcat·maven·intellij-idea
速易达网络1 小时前
基于Java Servlet的用户登录系统设计与实现
java·前端·mvc
散一世繁华,颠半世琉璃1 小时前
从 0 到 1 优化 Java 系统:方法论 + 工具 + 案例全解析
java·性能优化·操作系统