Maven

Maven

1、为什么要学Maven

①现有技术栈已经可以开发完整的项目

在这里插入图片描述

②实际开发流程

在这里插入图片描述

在这里插入图片描述

结论:在实际发布项目的过程中,没有类似IDEA、Eclipse这样的图形化界面集成工具可以使用,只能在命令行环境下对项目的源代码进行“构建”操作。Maven就是在命令行环境下帮我们完成构建操作的。

2、什么是Maven

Maven是Apache软件基金会组织维护的一款构建和依赖管理工具。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HLN3agWL-1595665525850)(images/maven-logo-black-on-white.png)]在这里插入图片描述

①构建

构建其实是一个用原材料生产产品的过程。

  • 原材料:Java源程序、图片、CSS样式文件、JavaScript脚本文件、框架配置文件。
  • 产品:一个在服务器上可以运行的项目。

构建过程涉及到的主要环节:

  • 清理:把上一次构建生成的结果删除,为下一次重新构建做好准备
  • 编译:把Java源程序编译得到*.class字节码文件
  • 测试:执行指定的测试程序,完成对项目特定点的功能测试
  • 报告:测试的结果的格式化呈现
  • 打包:Java工程生成jar包,Web工程生成war包
  • 安装:就Maven而言,安装就是把上一步打包的结果保存到本地仓库
  • 部署:把打包的结果放到服务器上

PS:构建过程的类比

生米→煮熟→熟饭

弹道导弹组件→组装→发射

②依赖

a.jar依赖b.jar时,说明a中用到了b中的类、资源文件等等。

例如:b.jar中声明了一个类Person。a.jar用到了Person

Person p = new Person();
p.getName();

在实际开发中,依赖是普遍存在的现象:

  • 一个大型项目,用到多个不同框架进行开发时,会以依赖的形式引入大量jar包。
  • jar包之间也大量存在错综复杂的依赖关系。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AXAey1af-1595665525852)(images/img003.jpg)]

  • 去哪下载jar包:官网找下载链接很难找,第三方网站提供的不规范
  • 依赖过程中,有可能出现jar包冲突

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fFwYCN5O-1595665525853)(images/img004.jpg)]

3、Maven工作机制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XCZljZuO-1595665525854)(images/img005.jpg)]

4、Maven安装和配置

①解压核心程序

把apache-maven-3.5.4-bin.zip解压到一个非中文没有空格的目录下。例如:D:\software\apache-maven-3.5.4

②配置环境变量

需要配置MAVEN_HOME和JAVA_HOME

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ycOKvWCy-1595665525855)(images/img006.jpg)]

需要PATH

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Nj50Zfx-1595665525856)(images/img007.jpg)]

③Maven本身配置

Maven核心配置文件位置:解压目录\conf\settings.xml,例如:

D:\software\apache-maven-3.5.4\conf\settings.xml
[1]修改本地仓库位置
<localRepository>D:/mvn-repository</localRepository>
[2]配置镜像仓库
<mirror>
	<id>nexus-aliyun</id>
	<mirrorOf>central</mirrorOf>
	<name>Nexus aliyun</name>
	<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

注意:要把上面的mirror标签放在mirros标签里面。

[3]配置JDK版本
<profile>
  <id>jdk-1.8</id>

  <activation>
	<activeByDefault>true</activeByDefault>
	<jdk>1.8</jdk>
  </activation>
  <properties>
	<maven.compiler.source>1.8</maven.compiler.source>
	<maven.compiler.target>1.8</maven.compiler.target>
	<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
  </properties>

</profile>

注意:上面的profile标签要放在profiles标签里面。

PS:XML语法

XML是extensible markup language的缩写,含义是可扩展标记语言。主要语法包括:

  • 第一行必须是XML声明:<?xml version=“1.0” encoding=“UTF-8”?>
  • 必须有一个唯一的根标签
  • 每一个标签都必须正确关闭
    • 双标签:<person>aaa</person>
    • 单标签:<hello/>
  • 标签里的每一个属性都必须有值,每个属性值都必须加引号(单引号、双引号都可以)

正确举例:

<person>
	<hello>Hi!</hello>
    <message school="agg"/>
</person>

错误举例:

<person>
<message school/>

④验证

执行mvn -v命令,看看能否出现Maven的版本信息。

C:\Users\Administrator>mvn -v
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)
Maven home: D:\software\apache-maven-3.5.4\bin\..
Java version: 1.8.0_111, vendor: Oracle Corporation, runtime: D:\software\java\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

5、在IDEA中使用Maven

①新建Maven工程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x0nvVMq8-1595665525857)(images/img010.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nv4cxVEd-1595665525857)(images/img011.jpg)]

②在IDEA中配置Maven信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3EjftcEd-1595665525858)(images/img012.jpg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FEEiHn0Q-1595665525859)(images/img013.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T7XKoaud-1595665525860)(images/img014.jpg)]

6、Maven核心概念:POM

①含义

POM:Project Object Model项目对象模型。

②思想

把现实生活中的事物抽象成模型,然后基于面向对象的思想,通过类和对象来描述这个模型,让程序通过操作类和对象管理现实生活中的数据,这样我们就可以使用代码解决现实生活中的问题了。

③对应

在Maven工程中,对应pom.xml配置文件。pom.xml配置文件是Maven工程的核心配置文件。

7、Maven核心概念:约定的目录结构

①各个目录的含义

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AOavQoF0-1595665525860)(images/img015.jpg)]

②Maven规定各个目录作用的原因

Maven作为一款自动化构建工具,需要让构建过程尽可能自动化。就拿“编译”来说,Maven需要知道去哪读取源文件,执行编译,知道把编译结果存放在哪里。

③体现思想

约定>配置>编码

8、Maven核心概念:坐标

①数学坐标

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sBM1Rii4-1595665525861)(images/img016.jpg)]

数学中使用x、y、z三个“向量”可以在空间中唯一的定位一个点。

②Maven坐标

Maven使用下面三个向量

  • groupid:用于定位一个公司或组织。习惯上会在公司或组织域名倒序的后面附加项目名称
  • artifactid:用于定位一个模块
  • version:指定当前Maven工程的版本

在Maven仓库中唯一的定位一个Maven工程(jar包)。例如:

<groupId>com.atguigu.maven</groupId>
<artifactId>maven-project</artifactId>
<version>1.0-SNAPSHOT</version>

③坐标和本地仓库中目录结构的对应关系

例如:

<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1</version>

这个坐标对应的仓库中的目录是:

Maven仓库根目录\commons-logging\commons-logging\1.1\commons-logging-1.1.jar

再比如:

  <groupId>org.springframework</groupId>
  <artifactId>spring-aop</artifactId>
  <version>4.0.9.RELEASE</version>

这个坐标对应的仓库中的目录是:

Maven仓库根目录\org\springframework\spring-aop\4.0.9.RELEASE\spring-aop-4.0.9.RELEASE.jar

要求:大家需要能够根据坐标信息到Maven仓库中找到jar包所在目录。

9、Maven核心概念:生命周期

Maven为了让构建过程能够自动化完成,设计了三个主要生命周期。

①Clean生命周期

与清理操作相关,包含三个主要环节

  • pre-clean
  • clean
  • post-clean

②Site生命周期

与生成项目信息站点相关,包含四个主要环节

  • pre-site
  • site
  • post-site
  • deploy-site

③Default生命周期

这个生命周期中包含了主要的构建操作,是最重要的生命周期。

validate
generate-sources
process-sources
generate-resources
process-resources 复制并处理资源文件,至目标目录,准备打包。
compile 编译项目的源代码。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 复制并处理资源文件,至目标测试目录。
test-compile 编译测试源代码。
process-test-classes
test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package
package 接受编译好的代码,打包成可发布的格式,如JAR。
pre-integration-test
integration-test
post-integration-test
verify
install将包安装至本地仓库,以让其它项目依赖。
deploy将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。

④生命周期执行的特点

  • 前面三个生命周期彼此是独立的。
  • 在任何一个生命周期内部,执行任何一个具体环节的操作,都是从本周期最初的位置开始执行,直到指定的地方。(记住这句话就行了,前面的不需要记)

10、Maven核心概念:插件和目标

①插件

Maven的核心程序仅仅负责宏观调度,不做具体工作。具体工作都是由Maven插件完成的。例如:编译就是由maven-compiler-plugin-3.1.jar插件来执行的。

②目标

一个插件可以对应多个目标,而每一个目标都和生命周期中的某一个环节对应。

Default生命周期中有compile和test-compile两个和编译相关的环节,这两个环节对应compile和test-compile两个目标,而这两个目标都是由maven-compiler-plugin-3.1.jar插件来执行的。

11、常用的Maven命令

①在命令行窗口执行Maven命令

注意:与构建相关的命令必须进入到pom.xml所在的目录才能执行。如果当前目录下没有pom.xml,会看到如下错误:

The goal you specified requires a project to execute but there is no POM in this directory (D:\stupid). Please verify you
invoked Maven from the correct directory. 
  • 清理mvn clean
  • 编译mvn compile
  • 测试mvn test
  • 打包mvn package
  • 安装mvn install

②IDEA中执行Maven构建命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DNvytINe-1595665525862)(images/img017.jpg)]

12、在Maven中使用测试程序

①加入junit依赖

<!-- 以依赖的形式配置当前Maven工程所需要的jar包 -->
<dependencies>

    <!-- 通过juni的坐标配置junit依赖 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        
        <!-- scope标签配置的是依赖的范围 -->
        <scope>test</scope>
    </dependency>
</dependencies>

②在test/java目录下创建测试程序

package com.atguigu.maven.test;

import com.atguigu.maven.entity.Employee;

// 静态导入。表示Assert类中的静态资源导入到当前类,可以不写类名直接调用
import static org.junit.Assert.*;
import org.junit.Test;

public class MyTest {

    @Test
    public void testEmployee() {
        Employee employee = new Employee();

        employee.setEmpName("Tom");

        String empNameActually = employee.getEmpName();

        String empNameExpected = "I am Jerry";

        // 断言
        assertEquals(empNameExpected, empNameActually);
    }

}

Assert类中的静态资源导入到当前类,可以不写类名直接调用
import static org.junit.Assert.*;
import org.junit.Test;

public class MyTest {

@Test
public void testEmployee() {
    Employee employee = new Employee();

    employee.setEmpName("Tom");

    String empNameActually = employee.getEmpName();

    String empNameExpected = "I am Jerry";

    // 断言
    assertEquals(empNameExpected, empNameActually);
}

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值