Maven

1.Maven简介

Maven 是 Apache 软件基金会组织维护的一款自动化构建工具, 专注服务于 Java 平台的项目构建和依赖管理

Maven作用:
● 依赖管理
● 项目构建

1.1依赖管理

通过一个项目依赖junit的实验来介绍依赖管理

1.不用Maven进行依赖管理

若不增加junit测试类库,则运行test1、2方法需要在main方法中调用,调用代码new Main().test2();,这样,运行哪个方法就要到main方法中更改一下方法名,非常不友好;若增加junit测试类库,则不需要在main方法中调用,junit会给一个@Test帮忙运行测试方法

(1)创建java project
在这里插入图片描述
(2)增加junit测试类库
在这里插入图片描述
(3)依赖junit类库
在这里插入图片描述
(4)进行测试

public class Main {
    public static void main(String[] args) {
//        System.out.println("Hello world!");
        new Main().test2();
    }

    @Test
    public void test1() {
        System.out.println("test1");
    }

    @Test
    public void test2() {
        System.out.println("test2");
    }


}

2.Maven进行依赖管理

注:想要用Maven进行依赖管理首先需要安装Maven,以下是安装并配置好Maven后的效果
用Maven进行依赖管理,在pom.xml中增加依赖,Maven会自动生成junit测试类库,此时,进行测试则不需要在main方法中,在想要测试的方法上面添加@Test即可
(1)新建一个项目,Build system选择Maven
在这里插入图片描述
(2)添加依赖
在这里插入图片描述
(3)查看依赖的类库
在这里插入图片描述
(4)进行测试
注: 点击红线处绿色圆圈可直接运行
在这里插入图片描述

1.2项目构建

● 清理:删除以前的编译结果,为重新编译做好准备
● 编译:将 Java 源程序编译为字节码文件
● 测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性
● 报告:在每一次测试后以标准的格式记录和展示测试结果
● 打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。 Java 工程对应 jar 包, Web工程对应 war 包
● 安装:在 Maven 环境下特指将打包的结果——jar 包或 war 包安装到本地仓库中
● 部署:将打包的结果部署到远程仓库或将 war 包部署到服务器上运行

创建的构建工具
● ant
● maven
● Gradle

1.3Maven的核心概念

Maven 能够实现自动化构建是和它的内部原理分不开的,这里我们从Maven的九个核心概念入手,看看Maven是如何实现自动化构建的
● POM
● 约定的目录结构
● 坐标
● 依赖管理
● 仓库管理
● 生命周期
● 插件和目标
● 继承

2.Maven安装

2.1下载解压

1.下载

在Apache Maven官方进行下载,下载最新版本即可
在这里插入图片描述

2.解压

在这里插入图片描述

2.2配置环境变量

1.配置maven的环境变量

注:配置Maven环境变量的过程和配置jdk环境变量的过程差不多
(1)找到maven的安装目录
在这里插入图片描述
(2)新建环境变量
这里环境变量名称为M2_HOME,环境变量的值为maven的安装地址

在这里插入图片描述
注:下图path这里增加的环境变量为maven的安装地址,但是它也可以写为%M2_HOME%\bin
在这里插入图片描述

2.测试maven的安装

在这里插入图片描述

2.3配置文件

1.settings配置文件

maven配置文件有2个

● 全局配置文件D:\maven\apache-maven-3.9.3-bin\apache-maven-3.9.3\conf,安装目录config下
在这里插入图片描述

● 用户配置文件~/.m2/settings.xml,这个配置文件开始不存在,需要自己创建.m2,拷贝配置文件
因为idea中默认使用用户配置文件,所以一般配置用户配置文件,这样idea就不需要在更改
在这里插入图片描述

2.profile配置

在settings配置文件中查看,配置maven项目的默认的JDK版本,比如指定所有maven项目采用jdk1.8
在这里插入图片描述

		<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>

注: 若想指定所有maven项目采用jdk11,则把jdk11的注释解放,并把jdk1.8注释掉即可

指定maven项目的jdk版本,也可以具体的在pom文件中指定

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

3.核心概念

3.1仓库

maven的仓库可以分为本地仓库和远程仓库

在这里插入图片描述

1.本地仓库

本地仓库相当于一个缓存,在电脑上是一个文件夹,我们可以设置这个文件夹的路径(具体怎么设置会在下面的配置体现),工程第一次需要某种jar包时,会从远程仓库(互联网)下载并保存到本地仓库中(在程序员的电脑上),当第二次使用时,不需要去远程仓库下载,会先去本地仓库中找,如果找不到才会去远程仓库上下载

默认情况下,每个用户在自己的用户目录下都有一个路径名为 .m2/respository/ 的仓库目录

(1)本地仓库的配置

本地仓库默认的路径
● linux:~/.m2/repository
● windows:c:\Users\Administrator.m2\repository\

自定本地仓库:
修改~/.m2/settings.xml

  <localRepository>d:\java\mvn_repo</localRepository>

2.远程仓库

远程仓库中分为中央仓库和私服两类

(1)中央仓库
中央仓库中的jar包由专业团队(Maven团队)维护,中央仓库中存放了全世界大多数流行的开源软件的jar包,是Maven默认的远程仓库

http://mvnrepository.com/:搜索中央仓库的中的依赖构件

要浏览中央仓库的内容,Maven 社区提供了一个 URL:http://search.Maven.org/#browse,使用这个仓库,开发人员可以搜索所有可以获取的代码库

(2)镜像私服
私服是另一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库,内部的项目还能部署到私服上供其他项目使用,除了中央仓库和私服,还有很多其他公开的远程仓库,常见的有java.net Maven库(http://download.java.net/maven/2/)和jboss Maven库(http://repository.jboss.com/maven2/)等,为了提高访问远程仓库的效率可以在特定的国家区域搭建的中央仓库的镜像私服

  • 阿里云镜像仓库

避免去中央仓库访问构件,提高访问效率,在宿主目录下的settings文件中查看,~/.m2/setting.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>

3.2mvn项目的目录结构

1.java项目(jar)

(1)test4项目-生成jar包

在这里插入图片描述
(2)test5项目-引用test4的jar依赖

在这里插入图片描述
(3)约定大于配置,maven的项目结构是约定的不能改变,结构如下

在这里插入图片描述
● pom.xml
● src/main/java
● src/main/resources
● src/test/java
● src/test/resources
● target

2.web项目(war)

3.3坐标

maven项目的坐标(gav坐标),在maven仓库定位构件使用groupId,artifactiId,version坐标来进行定位
在这里插入图片描述
执行完mvn install本地仓库中相应的坐标下,产生jar

在这里插入图片描述
在这里插入图片描述

4.maven常见的命令

4.1 mvn compile:编译

编译程序,会生成target目录,并在target中编译成.class
在这里插入图片描述

在这里插入图片描述

4.2 mvn clean:清理

删除target,清理输出目录
在这里插入图片描述

4.3 mvn test:执行测试计划

执行测试,注意测试失败,不能打包,要想执行测试,一定要有测试文件

1.若测试之前没有target目录,则执行测试会生成一个target目录,但是此时还没有打包,所以target目录中没有jar包

在这里插入图片描述
在这里插入图片描述

4.4 mvn package:打包

打包成jar文件,输出到target

1.有target目录但是没有jar包,mvn package会打包jar文件输出到target

在这里插入图片描述

2.没有target目录的情况下,mvn package可以打包jar并输出到target,此时有了一个target目录,并且此目录下有一个jar包

在这里插入图片描述
在这里插入图片描述

4.5 mvn install :部署

部署jar文件,部署到本地仓库

1.有target目录和jar包的情况下,mvn install部署jar文件,部署到本地仓库

在这里插入图片描述

2.没有target目录的情况下,mvn install可以直接打包jar包并部署到本地库,此时在原项目中会生成一个有jar包的target目录

在这里插入图片描述

4.6 mvn deploy

部署jar包,部署到远程仓库

4.7 mvn clean install:清理,部署

先清理,然后部署

1.项目中没有target目录和jar包时,并且本地库也没有部署jar包,mvn clean install可以直接打包jar包并部署到本地库,此时在原项目中会生成一个有jar包的target目录

在这里插入图片描述
在这里插入图片描述

4.8 忽略测试,直接部署

mvn clean install -Dmaven.test.skip=true

1.测试失败,正常来说不能打包

在这里插入图片描述

2.忽略测试直接部署,此时可部署到本地仓库

在这里插入图片描述

5.maven依赖实战

在这里插入图片描述
注: idea中的可以是一个project中有多个module

5.1创建空项目

在这里插入图片描述

5.2配置项目默认的JDK

在这里插入图片描述

5.3创建maven-first

在这里插入图片描述

1.在pom.xml添加junit依赖

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

2.创建HelloFirst类

package com.sys.demo;

public class HelloFirst {
    public String sayHello(){
        return "hello first";
    }
}

在这里插入图片描述

3.创建测试类HelloFirstTest

package com.sys.demo;

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

import static org.junit.Assert.*;

public class HelloFirstTest {
    HelloFirst helloFirst = new HelloFirst();

    @Test
    public void sayHello() {
        Assert.assertTrue("hello first".equals(helloFirst.sayHello()));
    }
}

在这里插入图片描述

4.打包jar

在这里插入图片描述

5.4创建maven-second

在这里插入图片描述

1.在pom.xml添加maven-first依赖、junit依赖

在这里插入图片描述

2.创建HelloSecond类

package com.sys.demo;

public class HelloSecond {
    HelloFirst helloFirst = new HelloFirst();

    public String sayHello(){
        return helloFirst.sayHello() + ":second";//会打印hello first:second
    }
}

在这里插入图片描述

3.创建测试类HelloSecondTest

package com.sys.demo;

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

import static org.junit.Assert.*;

public class HelloSecondTest {
    HelloSecond helloSecond = new HelloSecond();

    @Test
    public void sayHello() {
        Assert.assertTrue("hello first:second".equals(helloSecond.sayHello()));
    }
}

在这里插入图片描述

6.父子项目工程

maven工程之间可以继承,子工程继承父工程后,就可以使用在父工程中引入的依赖

6.1父项目

1.父项目的打包方式为pom

    <groupId>com.sunyanshu</groupId>
    <artifactId>auth-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

6.2子项目

1.子项目会多一个<parent>标签

   <parent>
        <groupId>com.sunyanshu</groupId>
        <artifactId>common</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

7.锁定版本依赖

锁定版本依赖使用<dependencyManagement>标签,这个标签只能用来锁定版本依赖,不具有导入依赖的功能,可以搭配<properties>标签一起使用,如下

<!--指定版本依赖-->
  <properties>
        <java.version>1.8</java.version>
        <alibaba.version>2.2.0.RELEASE</alibaba.version>
        <mybatis-plus.version>3.4.1</mybatis-plus.version>
        <mysql.version>5.1.32</mysql.version>
        <jwt.version>1.0.0</jwt.version>
<!--        <knife4j.version>2.0.8</knife4j.version>-->
        <fastjson.version>1.2.29</fastjson.version>
    </properties>

    <!--锁定版本依赖-->
    <dependencyManagement>
        <dependencies>

            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis-plus.version}</version>
            </dependency>

            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>

<!--            <dependency>-->
<!--                <groupId>com.github.xiaoymin</groupId>-->
<!--                <artifactId>knife4j-spring-boot-starter</artifactId>-->
<!--                <version>${knife4j.version}</version>-->
<!--            </dependency>-->

            <dependency>
                <groupId>com.auth0</groupId>
                <artifactId>java-jwt</artifactId>
                <version>${jwt.version}</version>
            </dependency>

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${fastjson.version}</version>
            </dependency>

        </dependencies>
    </dependencyManagement>

<properties>标签定义了一些属性变量,例如 java.version、alibaba.version 等等,用于在依赖引入和其他配置中使用,在这个例子中,mybatis-plus-boot-starter、mysql-connector-java、java-jwt 和 fastjson 这些依赖版本号都是通过这些属性进行配置的

<dependencyManagement>标签则用于管理项目中所有依赖的版本,这些依赖可以是自己编写的,也可以是第三方库,它的作用是为所有依赖设置一个默认的版本号,这样就不需要在每个依赖中都指定版本号了,如果某个依赖在这里没有声明版本号,那么使用该依赖时,Maven 将会报错

需要注意的是,<dependencyManagement>标签只是为所有依赖设置了一个默认版本号,并不会实际引入依赖,所以在<dependencies>标签中,依然需要显式地声明依赖关系,包括它们的 groupId、artifactId 和版本号等信息,并且在<dependencyManagement>标签中锁定版本依赖后,那么在实际在<dependencies>标签中引入依赖时则不需要写<version>标签了,如下

<dependencies>
       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值