maven

maven

1,Maven 简介

1.1 maven能做什么
  • 项目的自动构建,帮助开发人员做项目代码的编译,测试,打包,安装,部署等工作。
  • 管理依赖(管理项目中使用的各种jar包)
    • 依赖:项目中需要使用的其他资源。常见的是jar。比如项目要使用mysql驱动,我们就说项目依赖mysql驱动。
1.2 什么是maven
  • maven是apache基金会的开源项目,使用java语法开发
  • maven是项目的自动化构建的工具
  • 构建过程的各个环节:清理,编译,测试,报告,打包,安装,部署
1.3 maven解压后的目录结构

在这里插入图片描述

2,Maven的核心概念

2.1 目录结构
  • maven项目使用的是大多数人遵循的目录结构,叫做约定的目录结构
  • 一个maven项目是一个文件夹。比如项目叫做Hello
Hello    项目文件夹
        \src
            \main       叫做主程序目录(完成项目功能的代码和配置文件)
                 \java    源代码(包和相关的类定义)
                 \resources   配置文件
            \test        放置测试程序代码(开发人员自己写的测试代码)
                 \java        测试代码的
                 \resource   测试程序需要的配置文件
        \pom.xml   maven的配置文件,核心文件
  • maven可以独立使用:创建项目,编译代码,测试程序,打包,部署等等
  • maven和idea一起使用,通过借助idea使用maven
2.2 pom文件
  • 即 Project Object Model 项目对象模型。 Maven 把一个项目的结构和内容抽象成一个模型,在 xml 文件中
    进行声明,以方便进行构建和描述, pom.xml 是 Maven 的灵魂。所以, maven 环境搭建好之后,所有的学习和操作都是关于 pom.xml 的
2.3 坐标
  • 坐标组成是groupid,artifiactld,version,坐标概念来自数学
  • 坐标的作用:确定资源的,是资源的唯一标识。在maven中,每个资源都是坐标,坐标值是唯一的。简称gav
 坐标:唯一值, 在互联网中唯一标识一个项目的
	  <groupId>公司域名的倒写</groupId>   //组织名称,公司,团体或者单位的标识。这个值常使用的公司的域名的倒写;如果项目比较大,也可以是域名倒写+大项目名称
     <artifactId>自定义项目名称</artifactId>   // 项目名称,如果groupId中有项目,此时当前的值就是子项目名。项目的名称是唯一的。
     <version>自定版本号</version>  //版本,项目的版本号,使用的数字。三位组成。例如 主版本号.次版本号.小版本号   例如5.2.5 ;  如果项目还在开发中,是不稳定版本,通常在版本后带-SNAPSHOT
    
  • 每个maven项目,都需要有一个自己项目的gav
  • 管理依赖,需要使用其他的jar,也需要使用gav作为标识
  • 搜索坐标的地址:https://mvnrepository.com/ 搜索使用的中央仓库, 使用groupId 或者 artifactId作为搜索条件
2.4 依赖 dependency
  • 依赖:项目中要使用的其他资源
  • 通过dependency和gav一起完成依赖的使用
  • Maven 的一个重要作用就是管理 jar 包,为了一个项目可以构建或运行,项目中不可避免的,会依赖很多其他的 jar 包,在 Maven 中,这些 jar 就被称为依赖,使用标签 dependency 来配置。 而这种依赖的配置正是通过坐标来定位的,由此我们也不难看出, maven 把所有的 jar 包也都视为项目存在了。
 <dependencies>
		 <!--依赖  java代码中 import -->
		 <dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.9</version>
		 </dependency>	 
 </dependencies>
 maven使用gav作为标识,从互联网下载依赖的jar包到本地仓库
  • packaging: 项目打包的类型,可以使 jar、 war、 rar、 ear、 pom,默认是 jar
  • **build** 表示与构建相关的配置, 例如设置编译插件的 jdk 版本
    
2.5 仓库
  • maven仓库存放的是:

    • 存放maven使用的jar 和 我们项目使用的jar

      maven使用的插件(各种jar)
      自己项目使用的jar(第三方的工具) ,如mysql驱动
      自己写的程序可以打包为jar,存放到仓库

  • 仓库的分类:

    • 本地仓库, 就是你的个人计算机上的文件夹,存放各种jar。默认路径是你登录操作系统的账号的目录中/.m2/repository

    • 远程仓库, 在互联网上的,使用网络才能使用的仓库
      ①:中央仓库,最权威的, 所有的开发人员都共享使用的一个集中的仓库,
      https://repo.maven.apache.org :中央仓库的地址
      ②:中央仓库的镜像:就是中央仓库的备份, 在各大洲,重要的城市都是镜像。

      ③:私服,在公司内部,在局域网中使用的, 不是对外使用的。

  • maven仓库工作方式
    在这里插入图片描述

2.6 maven生命周期,插件和命令
  • maven的生命周期:项目构建的各个阶段,包括清理,编译,测试,报告,打包,安装,部署;

  • 插件:要完成构建项目的各个阶段,要使用maven的命令,执行命令的功能是通过插件来完成的。插件就是jar,一些类

  • 命令:执行maven功能是由命令发出的。比如mvn compile。

  • 单元测试(junit):junit是一个单元测试的工具,在java中经常使用

  • 单元:在java中指的是方法。一个方法就是一个单元,方法是测试的最小单位

  • 测试方法的定义:public方法,没有返回值,方法名称自定义(建议Test+测试的方法名称),方法没有参数

mvn中的常用命令
  • mvn clean 清理(会删除原来编译和测试的目录,即 target 目录,但是已经 install 到仓库里的包不会删除)

  • mvn compile 编译主程序,把src/main/java目录中的java代码编译为class文件,同时把class文件拷贝到target/classes目录。这个目录classes是存放类文件的根目录(也叫类路径,classpath)

  • mvn test-compile 编译src/test/java目录中的源文件,把生成的class拷贝到target/test-classes目录。同时把src/test/resources目录中的文件拷贝到test-classess目录

  • mvn test 测试目录,执行test-classes目录的程序,(会生成一个目录surefire-reports,保存在target中。保存测试结果)

  • mvn package 打包主程序(会编译、编译测试、测试、并且按照 pom.xml 配置把主程序打包生成 jar 包或者 war 包)

    • 打包的文件包含的是src/main目录中的所有的生成的class和配置文件和test无关
  • mvn install 把生成的打包的文件放到本地仓库中(会把本工程打包,并且按照本工程的坐标保存到本地仓库中)

    • 仓库中的jar包的位置
    • 在这里插入图片描述
      在这里插入图片描述
  • mvn deploy 部署主程序(会把本工程打包,按照本工程的坐标保存到本地库中,并且还会保存到私服仓库中。还会自动把项目部署到 web 容器中)

插件
  • maven-compiler-plugin 版本3.1 编译代码的插件

  • maven-resources-plugin 版本2.6 资源插件,处理文件的。作用是把src/main/resources目录中的文件拷贝到target/classes目录中

  • maven-jar-plugin 这个插件是把 class 文件、配置文件打成一个 jar(war 或其它格式)包
    在这里插入图片描述

  • maven-install-plugin 发布插件的功能就是把构建好的 artifact 部署到本地仓库,还有一个 deploy 插件是将构建好的 artifact 部署到远程仓库

  • 插件可以在自己的项目中设置, 最常使用的是 maven 编译插件。设置项目使用的 jdk 版本时通过编译插件指定。
    pom.xml 文件中设置。

<build>
   <plugins>
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
             <source>1.8</source>
             <target>1.8</target>
       </configuration>
      </plugin>
    </plugins>
</build>

在这里插入图片描述

3,maven和idea集成

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

在这里插入图片描述

在这里插入图片描述

4,依赖管理

  • 依赖范围, 使用scope表示的。
    • scope的值有 compile, test, provided ,默认是compile
    • scope:表示依赖使用的范围,也就是这个依赖(jar和里面类)在maven构建项目的哪些阶段中起作用。
    • maven构建项目 编译, 测试 ,打包, 安装 ,部署 过程(阶段)
  • compile :默认的,参与构建项目的所有阶段
  • test: 测试,在测试阶段使用,比如执行mvn test会使用junit
  • provided:提供者。项目在部署到服务器时,不需要提供这个依赖的jar,而是由服务器提供这个依赖的jar包。明显的是servlet和jsp依赖

5,常用设置(讲的是properties它里面的设置)

  • 在 Maven 的 pom.xml 文件中, 用于定义全局变量, POM 中通过${property_name}的形式引用变量的值。
    定义全局变量:
<properties>
自定义变量
<spring.version>4.3.10.RELEASE</spring.version>
</properties>
  • 引用的全局变量
<dependency>
      <groupId>org.springframework</groupId>
       <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
</dependency>
  • Maven 系统采用的变量:
<properties>
     <maven.compiler.source>1.8</maven.compiler.source> 源码编译 jdk 版本
     <maven.compiler.target>1.8</maven.compiler.target> 运行代码的 jdk 版本
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 项目构建使用的编码,避免中文乱码
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 生成报告的编码
</properties>
使用资源插件
  • 处理的配置文件的信息,maven默认处理配置文件

    • maven会把src/main/resources目录中的文件,拷贝到target/classes目录下
    • maven只处理src/main/java目录中的.java文件,把这些java文件编译为class,拷贝到target/classes目录中。不处理其他文件。
  • src/main/java 和 src/test/java 这两个目录中的所有*.java 文件会分别在 comile 和 test-comiple 阶段被编译,编译结果分别放到了 target/classes 和 targe/test-classes 目录中,但是这两个目录中的其他文件都会被忽略掉,如果需要把 src 目录下的文件包放到 target/classes 目录,作为输出的 jar 一部分。需要指定资源文件位置。 以下内容放到标签中。

<build>
     <resources>
          <resource>
              <directory>src/main/java</directory><!--所在的目录-->
              <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
              </includes>
               <!—filtering 选项 false 不启用过滤器, *.property 已经起到过滤的作用了 -->
            <filtering>false</filtering>
          </resource>
     </resources>
</build>

Maven进阶

1,创建maven父工程

在这里插入图片描述

  • 父工程的 packaging 标签的文本内容必须设置为 pom

  • 父工程要求 src 目录必须删除掉。

  • 父工程添加的依赖,所有子模块会无条件的去继承

  • maven多模块管理,其实就是让它的子模块的pom文件来继承父工程的pom文件。

  • 以上做法,子模块会无条件继承父工程的所有依赖,导致的问题是,本不需要的继承的依赖也会被继承,这就大大增加了项目模块最终打包的大小,也可能为上线埋下了隐患。也就是说,父工程管理的是所有项目模块的依赖,而不是某一个项目模块的依赖,所以某一个项目模块不需要继承父工程中的所有依赖, 这就需要子项目模块向父工程声明需要的依赖即可(声明式依赖)。而此时,父工程实际只需要管理依赖的版本号即可。

    • 父工程添加 dependencyManagement 标签管理依赖:
      在这里插入图片描述
  • 由于父工程管理依赖的版本号,那么子模块要想继承依赖,只能通过声明式来添加依赖,实际上,子模块中的依赖是继承父工程依赖的版本号;如果子模块已定义依赖版本号,那么以子模块定义的版本号为准。
    在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值