从头到尾讲一遍maven项目管理(基础到高级)

一、maven基础

01Maven简介-Maven的概念与作用

Maven是什么

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

f2a1fd9dc7c94c3484a7a30a9fccca98.png

Maven的作用

  • 项目构建提供标准的、跨平台的自动化项目构建方式
  • 依赖管理:方便快捷的管理项目依赖的资源 (ar包),避免资源间的版本冲突问题
  • 统一开发结构:提供标准的、统一的项目结构

f1f591163af446be94da1ef5a8fc6db8.png

 

02.maven下载与安装

  网址:Maven – Download Apache Maven

18d43777db9e4970b2b36915dab1f7e5.png

Maven环境变量配置

 

  • 依赖Java,需要配置JAVA_HOME
  • 设置MAVEN自身的运行环境,需要配置MAVEN_HOME1ffd9f3c62ec4f68bacbe988dfe0770c.png8e764221479a46e2979879fbdd15d8f2.png063b6ba3509e4ce0836e3a8dc3f4211f.png
  • 测试环境配置结果

win+R 打开dos窗口,通过 mvn -v命令检查 maven 是否安装成功

mvn -v

 

 

03.Maven基本概念-仓库

dc7cae937ba74d858af0f9aa72fd17cb.png

仓库

  • 仓库:用于存储资源,包含各种iar包
  • 仓库分类:
    • 本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源
    • 远程仓库:非本机电脑上的仓库,为本地仓库提供资源
      • 中央仓库:Maven团队维护,存储所有资源的仓库
      • 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源
  • 私服的作用:
    • 保存具有版权的资源,包含购买或自主研发的iar
      • 中央仓库中的iar都是开源的,不能存储具有版权的资源
    • 一定范围内共享资源,仅对内部开放,不对外共享

 

坐标

  • 什么是坐标?

                Maven中的坐标用于描述仓库中资源的位置
                https://repo1.maven.org/maven2/

  • Maven坐标主要组成

                groupld:定义当前Maven项目隶属组织名称 (通常是域名反写,例如:org.mybatis)

                artifactld:定义当前Maven项目名称(通常是模块名称,例如CRM、SMS)

                version:定义当前项目版本号

                packaging:定义该项目的打包方式

  • Maven坐标的作用

                使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成

 

在控制台输入:mvn(在c盘自动生成一个.m2,见下图)

04.Maven基本概念-仓库配置

本地仓库配置

a5a003faf39f49499a4c60ca1d372c3b.png

 

因为C盘是一个系统盘,所以不建议存储再c盘,在其余盘(例如D盘)新建一个文件,此处为maven

899cd999132a495f9ad488e63b3ec20d.png

在maven下面新建一个repository(仓库)

7618360259084b4abe2ae337121e715a.png

此时还不是我们自己的仓库,所以需要修改相应的配置

进入maven的安装目录,

例如:D:\Maven\apache-maven-3.9.0\conf

在conf下找到

354d9aa5095b4c25a912c587d488833f.png

0c796dd489b24e1a891dc5cacb0357db.png

f8f97a4b25e94251817174cf99278cfb.png

本地仓库配置

  • Maven启动后,会自动保存下载的资源到本地仓库
    • 默认位置
  <localRepository>${user.home)/.m2/repository</localRepository>
  • 当前目录位置为登录用户名所在目录下的m2文件夹中
    • 自定义位置
<localRepository>D: maven repository</localRepository>

        当前目录位置为D:maven\repository文件夹中

远程仓库配置

在maven里找到lib再找到setting.xml

e81bf2f295da4fd79c7aa47088264b1a.png

    <mirror>
      <!-- 此镜像的唯一标识符,用来区分不同的mirror元素 -->
      <id>nexus-aliyun</id>
      <!-- 对哪种仓库进行镜像,简单说就是替代哪个仓库  -->
      <mirrorOf>central</mirrorOf>
       <!-- 镜像名称 -->
      <name>Nexus aliyun</name>
      <!-- 镜像URL -->
      <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>

全局setting与用户setting区别

  • 全局settting定义了当前计算器中Maven的公共配置
  • 用户settting定义了当前用户的配置

05.生成maven项目的方式(3种)

第1种:手工搓一个maven项目

ddcd60a9d8ca4567bc0ff60d2084eeb9.png

按照上述建立一个文件夹,再在main和test的Java里建立一个com,以及自定义的包(eg:neuedu),在包里写一个demo.java

0f32354c840c45d1997019a2b7ab9b35.png

package com.neuedu;

public class Demo {
	public String say(String name){
			System.out.println("hello "+ name);
			return "hello "+name;
	}
}

同样的操作,在test的java下,com下有一个自定义的包,包下有一个DemoTest.java

721e5c6079b64cfda4c6b5af0ca5d2f8.png

package com.neuedu;

import org.junit.Test;
import orgjunit.Assert;

public class DemoTestf{
	@Test
	public void testSay(){
			Demo d = new Demo();
			String ret = d.say("maven");
			Assert.assertEquals("hello maven",ret);
	}
}

在maven的同层目录下建立一个pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project
	xmlns="http://maven.apache .org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMSchema-instance"
	xsi:schemalocation="http://maven.apache.org/PoM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.neuedu</groupId>
	<artifactId>project-java</artifactId>
	<version>1.0</version>
	<packaging>jar</packaging>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
		</dependency>
	</dependencies>
</project>

        

Maven项目构建命令

  • Maven构建命令使用mvn开头,后面添加功能参数,可以一次执行多个命令,使用空格分隔
mvn compile            #编译
mvn clean              #清理
mvn test               #测试
mvn package            #打包
mvn install            #安装到本地仓库

第2种:使用插件创造一个项目

插件创建工程

a905a35cf3b94b28a29596fa3745203d.png

创建工程
mvn archetype:generate
        -DgroupId={project-packaging}

        -DartifactId={project-name}

        -DarchetypeArtifactId=maven-archetype-quickstart

        -DinteractiveMode=false
创建iava工程
mvn archetype:generate -DgroupId=com.itheima -DartifactId=java-project-DarchetypeArtifactId-maven-archetype-quickstart -Dversion=0.0.1-snapshotDinteractiveMode=false
创建web工程
mvn archetype:generate -DgroupId=com.itheima -DartifactId=web-project

DarchetypeArtifactId=maven-archetype-webapp-Dversion=0.0.1-snapshot

DinteractiveMode=false

创建工程
mvn archetype:generate
        -DgroupId={project-packaging}
        -DartifactId={project-name}
        -DarchetypeArtifactId=maven-archetype-quickstart
        -DinteractiveMode=false

创建iava工程
mvn archetype:generate -DgroupId=com.itheima -DartifactId=java-project-DarchetypeArtifactId-
maven-archetype-quickstart -Dversion=0.0.1-snapshotDinteractiveMode=false

创建web工程
mvn archetype:generate -DgroupId=com.itheima -DartifactId=web-project
DarchetypeArtifactId=maven-archetype-webapp-Dversion=0.0.1-snapshot
DinteractiveMode=false

03e33da1d84c47ebb73ac200638fe885.png

第3种:使用idea生成一个maven项目

使用idea创建一个空的工程

45494af0fd4345dea386c1c82e0b8ba2.png

88728545d8134ef4adc4bb9fa59f29e0.png

ac4191ff24324538879b1028a957e4d5.png

988f5edc3edf43c988cdada2ee272741.png

e6399bd7fa1a4fd5b4c44c0accf57523.png

1203b2b4a0984455a8bd79a777bd6afc.png

0238d47c39cb42c58e18fbddb76604b5.png

06.依赖管理

依赖配置

  • 依赖指当前项目运行所需的jar,一个项目可以设置多个依赖
  • 格式:
<!--设置当前项目所赖的所有jar-->
<dependencies>
        <!-设置具体的依赖-->
        <dependency>
                <!-所属群组id-->
                <groupId>junit</groupId>
                <!-赖所属项目id-->
                <artifactId>junit</artifactId
                <!-赖版本号-->
                <version>4.12</version>
        </dependency>
</dependencies>

依赖传递

依赖具有传递性

  • 直接依赖:在当前项目中通过依赖配置建立的依赖关系
  • 间接依赖:被资源的资源如果依赖其他资源,当前项目间接依赖其他资源

依赖传递冲突问题

  • 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
  • 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
  • 殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的

ad0d9212c544459ab2d9ddf3598f81f4.png

可选依赖

是私房钱(控制别人能不能看见你的依赖,不想让别人知道你用过什么依赖)

  • 可选依赖指对外隐藏当前所依赖的资源一一不透明
<dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <optional>true</optional>
</dependency>

 

排除依赖

是主动断开这个间接依赖的资源

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

 

依赖范围

  • 依赖的iar默认情况可以在任何地方使用,可以通过  scope   标签设定其作用范围
  • 作用范围
    • 主程序范围有效(main文件夹范围内)
    • 测试程序范围有效(test文件夹范围内)
    • 是否参与打包(package指令范围内)
scope主代码测试代码打包范例

compile

YYYlog4j
test Y junit
providedYY servlet-api
runtime  Yjdbc

07.maven生命周期(几岁)与插件(几岁干什么事儿)

项目构建生命周期

  •  Maven对项目构建的生命周期划分为3套
    • clean:清理工作
    • default:核心工作,例如编译,测试,打包,部署等
    • site:产生报告,发布站点等

3827f287ce3b4f31bb0494f37cc37e27.png

clean生命周期

pre-clean             执行一些需要在clean之前完成的工作
clean                 移除所有上一次构建生成的文件
post-clean            执行一些需要在clean之后立刻完成的工作

da4fb6eb3a014811b9ce8e851dc01f99.png

 

site构建生命周期

pre-site               执行一些需要在生成站点文档之前完成的工作
site                   生成项目的站点文档
post-site              执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy            将生成的站点文档部署到特定的服务器上

插件

  • 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
  • 默认maven在各个生命周期上绑定有预设的功能
  • 通过插件可以自定义其他功能
<build>
        <plugins>
                <plugin>
                        <groupId>org.apache .maven.plugins</groupId>
                        <artifactId>maven-source-plugin</artifactId>
                        <version>2.2.1</version>
                        <executions>
                                <execution>
                                        <goals>
                                                <goa1>jar</goal>
                                        </goals>
                                        <phase>generate-test-resources</phase>
                                </execution>
                        </executions>
                </plugin>
        </plugins>
</build>

 

f354bab158c34baebff72bc6e482b102.png

二、分模块开发与设计

工程模块与模块划分

主模块里面什么都不做,通过分模块里的东西进行操作,分模块实现相关功能 

8bc9b8348e1a4fe8a53d29e32a3e6589.png

dao模块拆分

 

ssm_dao拆分

  • 新建模块
  • 拷贝原始项目中对应的相关内容到ssm_dao模块中
    • 数据层接口(UserDao)
    • 配置文件:保留与数据层相关配置文件(3个)
      • 注意:分页插件在配置中与SqlSessionFactoryBean绑定需要保留
    • pom.xml:引入数据层相关坐标即可,删除springmvc相关坐标
      • spring
      • mybatis
      • spring整合mybatis
      • mysql
      • druid
      • pagehelper
      • 直接依赖ssm_pojo(对ssm_pojo模块执行install指令,将其安装到本地仓库)

ssm_service拆分

  • 新建模块
  • 拷贝原始项目中对应的相关内容到ssm_service模块中
    • 业务层接口与实现类(UserService、UserServicelmpl)
    • 配置文件:保留与数据层相关配置文件(1个)
    • pom.xml:引入数据层相关坐标即可,删除springmvc相关坐标
      • spring
      • junit
      • spring整合junit
      • 直接依赖ssm_dao(对ssm_dao模块执行install指令,将其安装到本地仓库)
      • 间接依赖ssm_pojo(由ssm_dao模块负责依赖关系的建立)
  • 修改service模块spring核心配置文件名,添加模块名称,格式:applicationContext-servicexml
  • 修改dao模块spring核心配置文件名,添加模块名称,格式:applicationContext-dao.xml
  • 修改单元测试引入的配置文件名称,由单个文件修改为多个文件

ssm_control拆分

  • 新建模块(使用webapp模板)
  • 拷贝原始项目中对应的相关内容到ssm_controller模块中
    • 表现层控制器类与相关设置类(UserController、异常相关·····.)
    • 配置文件:保留与表现层相关配置文件(1个)、服务器相关配置文件 (1个)
    • pomxml:引入数据层相关坐标即可,删除springmvc相关坐标
      • spring
      • springmvc
      • jackson
      • servlet
      • tomcat服务器插件
      • 直接依赖ssm_service(对ssm_service模块执行install指令,将其安装到本地仓库)
      • 间接依赖ssm dao、ssm_pojo
    • 修改webxml配置文件中加载spring环境的配置文件名称,使用通配,加载所有applicationContext-开始的配置文件
  • 分模块开发
    • 模块中仅包含当前模块对应的功能类与配置文件
    • spring核心配置根据模块功能不同进行独立制作
    • 当前模块所依赖的模块通过导入坐标的形式加入当前模块后才可以使用
    • web.xml需要加载所有的spring核心配置文件

 

聚合(重点)

cfc11a8dbfbf43298c01363efa3ecb5d.png

 

  • 作用:聚合用于快速构建maven工程,一次性构建多个项目/模块。
  • 制作方式:
    • 创建一个空模块,打包类型定义为pom
packaging>pom</packaging>
  • 定义当前模块进行构建操作时关联的其他模块名称
<modules>
        <module>../ssm controller</module>
        <module>../ssm service</module>
        <module>../ssm dao</module>
        <module>../ssm pojo</module>
​​​​​​​</modules>
  • 注意事项:参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关

 

  • 聚合的作用
  • 聚合的配置方式
  • 模块的类型
    • pom
    • war
    • jar

继承(重点)

 

  • 作用:通过继承可以实现在子工程中沿用父工程中的配置
    • maven中的继承与java中的继承相似,在子工程中配置继承关系
  • 制作方式
    • 在子工程中声明其父工程坐标与对应的位置
<!--定义该工程的父工程-->
<parent>
        <groupId>com.itheima</groupId>
        <artifactId>ssm</artifactId>
        <version>1.0-SNAPSHOT</version>
        <!--填写父工程的com文件.>
        <relativePath>../ssm/pom.xml</relativePath>
</parent>

 

可继承的资源

b578a0ca01e44e46bee7699835850e5f.png

 

继承依赖定义

  • 在父工程中定义依赖管理
<!--声明此处进行依赖管理-->
<dependencyManagement>
        <!--具体的赖-->
        <dependencies>
                <!--spring环境-->
                <dependency>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring-context</artifactId>       
                         <version>5.1.9.RELEASE</version>
                </dependency>
        </dependencies>
</dependencyManagement>

 

继承依赖使用

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

<dependencies>
        <!--spring环境-->
        <dependency>
                <groupId>org.springframework</groupId>
​​​​​​​                <artifactId>spring-context</artifactId>
        </dependency>
</dependencies>

​​​​​​​继承与聚合

  • 作用

    • 聚合用于快速构建项目

    • 继承用于快速配置

  • 相同点

    • 聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中
    • 聚合与继承均属于设计型模块,并无实际的模块内容
  • 不同点:

    • 聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些

    • 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己

  • 依赖继承
    • 定义在父工程中
    • 使用在子工程中(无需配置version)

属性(重点)

属性类别:内置属性

  • 作用
    • 使用maven内置属性,快速配置
  • 调用格式
S{basedir]
S{version]

 

属性类别: Setting属性

  • 使用
    • Maven配置文件setting.xm[中的标签属性,用于动态配置
  • 调用格式

S{settings.localRepository]

 

属性类别:Java系统属性

  •  作用:
    • 读取Java系统属性
  • 调用格式

S{user.home]

  • 系统属性查询方式

mvn help:system

​​​​​​​
版本管理

工程版本

  • SNAPSHOT(快照版本)

    项目开发过程中,为方便团队成员合作,解决模块间相互依赖和时时更新的问题,开发者对每个模块进行构建的时候,输出的临时性版本叫快照版本(测试阶段版本)快照版本会随着开发的进展不断更新
  • RELEASE(发布版本)

    项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的,即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本

工程版本号约定

  • 约定规范:
    • <主版本>.<次版本>.增量版本>.里程碑版本>
    • 主版本:表示项目重大架构的变更,如:spring5相较于spring4的迭代
    • 次版本:表示有较大的功能增加和变化,或者全面系统地修复漏洞
    • 增量版本:表示有重大漏洞的修复t
    • 里程碑版本:表明一个版本的里程碑(版本内部)。这样的版本同下一个正式版本相比,相对来说不是很稳定,有待更多的测试
  • 范例:
    • 5.19RELEASE

资源配置

586f5b532cce46dba571c99d9f32d899.png

7602d4cc7071455aaadb0f1b771cf80a.png

f8e0c50336224bc6a1c7f8a066a53b11.png

 

配置文件引用pom属性

  • 作用
    • 在任意配置文件中加载pom文件中定义的属性
  • 调用格式

S{jdbc.ur1)

  • 开启配置文件加载pom属性
<!--配置资源文件对应的信息-->
 <resources>
        <resource>
                <!-设定配置文件对应的位置目录,支持使用属性动态设定路-->
                <directory>${project.basedir}/src/main/resources</directory>
​​​​​​​                <!--开启对配置文件的资源加载过滤-->
                <filtering>true</filtering>
        </resource>
</resources>

多环境开发配置

73c289219e0544e992418d6d10231e22.png

6644604c352843fe812303248e7d6035.png

73737cfc7bae4acc9afd85facd61f65f.png

使用时需要使用默认的指令

加载指定环境

  • 作用
    • 加载指定环境配置
  • 调用格式

mvn 指令-P 环境定义id

  • 范例

mvn install -P pro env

跳过测试( 了解)

 

使用命令跳过测试

mvn 指令 -D skipTests

  • 注意事项
    • 执行的指令生命周期必须包含测试环节​​​​​​​

7393ab098e5547b78280a2999e11f39d.png

4fcf92d23d454171862f66f8c934c252.png

176d69b894f54454a3d25a4d115d75f9.png

36fe6489a53c4aa6ae4ab240010b1555.png
私服(重点)

私服的安装、访问、配置

8a15d7784677476491bd73ba06cfa576.png

​​​​​​​Nexus

  • Nexus是Sonatype公司的一款maven私服产品
  • 下载地址:https://help.sonatype.com/repomanager3/download

Nexus安装、启动与配置

  • 启动服务器(命令行启动)

nexus.exe /run nexus

  • 访问服务器(默认端口:8081)

http://localhost:8081

  • 修改基础配置信息
    • 安装路径下etc目录中nexus-default.properties文件保存有nexus基础配置信息,例如默认访问端口
  • 修改服务器运行配置信息
    • 安装路径下bin目录中nexusvmoptions文件保存有nexus服务器启动对应的配置信息,例如默认占用内存空间

0b1671c107ec48ccb234cfe3aef79fbc.png

仓库分类

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

6c38f72741ec4328917e1b96fca2b0c6.png

010ebfca052545e88a9e21cc36394920.png

建立一个仓库

70da8831b7be4895b3257d0d2bfcd711.png

b1e1c7b1af074325ace47cd309033a13.png

1f2b75365ce94ce2961dc8571897b83c.png

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值