Maven

Maven简介

Maven是一个项目管理工具。它可以帮助程序员构建工程,管理jar 包,编译代码,完成测试,项目打包等等。

  • Maven工具是基于POM(Project Object Model,项目对象模型)实现的。在Maven的管理 下每个项目都相当于是一个对象。
  • Maven标准化了项目的构建。即对项目结构,构建命令等进行了标准化定义。
  • Maven提供了一个免费的中央仓库,在其中几乎可以找到任何的流行开源类库。
  • Maven是跨平台的,在Windows、Linux、Mac上,都可以使用同样的命令。

Maven的作用

一键构建, 依赖管理。

Maven的安装

下载

进入https://maven.apache.org/download.cgi即可完成下载
image.png

安装

解压下载好的安装文件,解压后目录结构如下: image.png

  • bin:存放maven的命令
  • boot:存放maven本身的引导程序,如类加载器等
  • conf:存放maven的配置文件
  • lib:存放maven本身运行所需的jar包

配置环境变量

由于Maven是由Java语言开发的,运行时依赖Java环境,所以要在 计算机的环境变量中配置 JAVA_HOME
image.png
为了更方便的使用Maven命令,需要在环境变量中配置 MAVEN_HOMEPath
image.png

查看版本

打开CMD命令窗口,输入 mvn -v ,显示Maven版本和Java版本,证 明安装成功
image.png

Maven工程的类型和结构

  • POM工程
    POM工程是逻辑工程,Maven并不会对该类型工程做打包处 理,这些工程往往不包含具体的业务,而是用来整合其他工程 的。

  • JAR工程

  • 普通Java工程,在打包时会将项目打成jar包。
    WAR工程 JAVA Web工程,在打包时会将项目打成war包。

一键构建_项目的生命周期

使用maven完成项目的构建的过程中,包括:验证、编译、测试、 打包、部署等过程,maven将这些过程规范为项目构建的生命周期。
image.png

maven有三套相互独立的生命周期。
分为是构建生命周期, clean生命周期(清理构建后的文件)、site生命周期(生成项 目报告)。

一键构建_Maven常用命令

image.png

Maven依赖插件来执行命令,比如clean、validate等命令是 maven自带的,tomcat7命令是引入的第三方插件。

依赖管理_Maven仓库类型

image.png

本地仓库

本地仓库指用户计算机中的文件夹。用来存储从远程仓库或中央仓库下载的jar包,只有下载到本地仓库的jar包才能使用,项目使用 jar包时优先从本地仓库查找。

远程仓库

远程仓库一般指私服,它是架设在局域网的仓库服务,可以从中央 仓库下载资源,供局域网使用,从而减少每个程序员都从中央仓库 下载浪费的带宽。
如果项目需要的jar包本地仓库没有,则会去远程仓库下载,下载到 本地仓库即可使用。

远程仓库不是必须配置的,如果本地仓库没有jar包,也没有配 置远程仓库,则会直接从中央仓库下载。

中央仓库

中央仓库是互联网上的服务器,是Maven提供的最大的仓库,里面 拥有最全的jar包资源。
如果项目需要的jar包,本地仓库和远程仓库都没有,则会去中央仓 库下载,下载到本地仓库使用。
Maven中央仓库访问页面:https://mvnrepository.com/

依赖管理_Maven配置文件

本地仓库的默认位置是 ${user.dir}/.m2/repository ${user.dir}表示 windows用 户目录,我们可以通过修改 ${MAVEN_HOME}\conf\settings.xml ,修改本地仓库 的位置。

配置本地仓库

在Maven的conf文件下找到settings.xml文件,修改文件中如下标签

<!-- 本地仓库路径 -->
<localRepository>F://repository</localRepository> 

由于中央仓库访问速度较慢,可以配置镜像代理中央仓库的下载请求。在 <settings> 下的 <mirrors> 中添加如下标签即可配置镜像:

 <mirror>  
    <!-- 指定镜像ID -->
    <id>nexus-aliyun</id>  
    <!-- 匹配中央仓库。-->
    <mirrorOf>central</mirrorOf>
    <!-- 指定镜像名称 -->    
    <name>Nexus aliyun</name>  
    <!-- 指定镜像路径 -->
	<url>http://maven.aliyun.com/nexus/content/groups/public</url>  
</mirror>

配置JDK版本

创建maven项目的时候,默认使用的JDK是1.5版本,验证语法、编译、运行时都会按照JDK1.5操作,这样就有很多语法无法使用。我们本机安装的JDK是JDK11,可以配置maven按照JDK11创建项目。

<settings> 下的 <profiles> 中添加如下标签即可配置JDK版本:

		<profile>
            <id>jdk-11</id>
            <activation>
                <activeByDefault>true</activeByDefault>
                <jdk>11</jdk>
            </activation>
            <properties>
                <maven.compiler.source>11</maven.compiler.source>
                <maven.compiler.target>11</maven.compiler.target>
                <maven.compiler.compilerVersion>11</maven.compiler.compilerVersion>
            </properties>
        </profile>

Maven工程开发_Idea配置Maven插件

在使用Idea开发项目时,可以整合Maven插件进行一键构建和依赖管理。Idea自带Maven插件,我们也可以指定自己下载的Maven插件。

依据图片指示,选择本地maven安装目录,指定settings配置文件。
在这里插入图片描述
之后,点击File — New Projects Settings — Settings for NewProjects,再设置一遍Maven,使得新项目也可以使用同样的Maven配置。
在这里插入图片描述

Maven工程开发_pom文件配置

pom文件最上方是项目基本信息:

  • groupId
    groupId一般定义项目组名,命名规则使用反向域名。
  • artifactId
    artifactId一般定义项目名,命名使用小写字母。项目发布后,它的坐标是groupId+artifactId。
  • version
    version定义版本号。版本号一般有三段,第一段:革命性的产品升级。第二段:新功能版本。第三段:修正一些bug。
  • packaging
    packaging定义打包方式。

<properties> 中定义一些配置信息:
在这里插入图片描述
<dependencies> 中定义依赖的jar包坐标:
<plugins> 中定义第三方插件:
web项目依赖tomcat运行,所以添加tomcat7插件

<plugins>
    <!-- tomcat插件 -->
    <plugin>      
		<groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
        <configuration>
            <port>8080</port>
            <path>/</path>
            <uriEncoding>UTF-8</uriEncoding>
            <server>tomcat7</server>
        </configuration>
    </plugin>
</plugins>

运行项目,按照如图步骤,配置使用maven中的tomcat7插件运行项目:
在这里插入图片描述
点击OK后配置完成,点击Idea的运行符号即可使用maven中的tomcat7插件运行项目。

Maven工程开发_依赖范围

通过在 <dependency> 中添加 <scope> ,可以设置依赖的作用范围,有以下取值:

  • compile
    默认范围。表示该依赖在编译和运行时生效,项目打包时也会将该依赖打包进去。
  • provided
    使用此依赖范围的Maven依赖,编译和测试时有效,但在运行时无效。典型的例子是servlet-api,在运行时Web容器已经提供依赖,就不需要Maven重复地引入一遍。
  • runtime
    runtime范围表明编译时不需要生效,而只在运行时生效。典型的例子是JDBC驱动包,编译时只需要JDK的JDBC接口即可,只有运行项目时才需要具体的JDBC驱动。
  • test
    test范围表明使用此依赖范围的依赖,只在编译和运行测试代码的时生效,程序的正常运行不需要此类依赖。典型的例子就是JUnit,它只有在编译测试代码及运行测试的时候才需要。
  • system
    如果有些你依赖的jar包没有Maven坐标的,它完全不在Maven体系中,这时候你可以把它下载到本地硬盘,然后通过system来引用。(不推荐使用)

Maven工程测试_测试概述

测试即在交付前对写好的代码进行评测,分为黑盒测试和白盒测试:

  • 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值。
  • 白盒测试:需要写代码的。关注程序具体的执行流程。

单元测试是指对软件中的最小可测试单元进行检查和验证,Java里单元测试指一个类的功能。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。

Junit是Java编程语言的单元测试框架,用于编写和运行可重复的自动化测试。从分类中属于白盒测试。

Maven工程测试_@Before、@After

在测试类中,@Before修饰的方法会在测试方法之前自动执行,@After修饰的方法会在测试方法执行之后自动执行。之后的学习中,我们可以设置前置方法为获取资源,后置方法为释放资源。

@Before
public void before(){
    System.out.println("开始测试");
}
@After
public void after(){
    System.out.println("结束测试");
}

依赖冲突调解_最短路径优先原则

Maven调解依赖冲突的第一原则是最短路径优先原则:

依赖冲突调解_最先声明原则

Maven调解依赖冲突的第二原则是最先声明原则:

如果路径相同,那么谁先声明就使用哪个谁的版本

依赖冲突调解_排除依赖、锁定版本

排除依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.2.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.12.RELEASE</version>
    <exclusions>
        <exclusion>
          <groupId>org.springframework</groupId>
           <artifactId>spring-aop</artifactId>
        </exclusion>
    </exclusions>
</dependency>

使用了 <exclusions> 标签来排除 spring-aop 模块的引入。这意味着在引入 spring-context 模块时,不会自动引入 spring-aop 模块。

锁定版本

在Maven中为某个jar包配置锁定版本后,不考虑依赖的声明顺序和依赖路径,以锁定的版本的为准添加到工程中,此方法在企业开发中常用。以下可以直接配置spring-aop锁定的版本。

<dependencyManagement>
    <dependencies>
        <dependency>
          <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
    </dependencies>
</dependencyManagement>

Maven聚合开发_聚合关系

Maven将一个大项目分成一个个小项目开发,最后打包时会将这些小的项目打成一个完整的war包独立运行。
在这里插入图片描述

Maven聚合开发_继承关系

Maven中的继承是针对于父工程和子工程。父工程定义的依赖和插件子工程可以直接使用。注意父工程类型一定为POM类型工程。

多继承

在Maven中对于继承采用的也是单继承,也就是说一个子项目只能有一个父项目。但我们可以在 <dependencyManagement> 配置多继承。写法如下:

<dependencyManagement>
    <dependencies>
        <!--父项目a-->
        <dependency>
            <groupId>com.gb</groupId>
      	    <artifactId>parent_a</artifactId>
            <version>1.0-SNAPSHOT</version*>
            <type>pom</type>
            <!-- 引入父项目,scope的值为import-->
            <scope>import</scope>
        </dependency>
        <!--父项目b-->
        <dependency>
            <groupId>com.gb</groupId>
          	<artifactId>parent_b</artifactId>
            <version>1.0-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值