Maven入门(详细)

821 阅读7分钟

***> 刚学完Maven,今天抽空把Maven的基本知识点进行整理,作为自己复习和查阅使用。(最近想要把自己学过的东西从按照自己平时的思维导图做个整理,哈哈哈,不忘初心,方得始终)


一、Maven的作用

Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。简单来说,就是构建项目和管理依赖,我们之前的项目都是一直在导jar包,而且会因为jar包的版本问题或者其他问题,增加了我们在jar包的使用难度,这些问题Maven都可以解决。

二、Maven的安装和配置

因为Maven是一个基于java的工具,所以我们先安装jdk,这个在之前就已经安装完成了,如果不确定可以查看自己的jdk版本。步骤是打开命令行输入java -version

jdk.jpg 如果显示java version则说明之前安装过jdk,那就可以开始下一个步骤了

Maven的下载和安装

Maven 下载地址:maven.apache.org/download.cg… Maven.jpg 红色框框是windows版本,存储位置自己定,然后解压缩安装,我的是:

Maven位置.jpg 这一步之后要指定本地仓库,做法是建一个mavenRepository文件夹,我的建在D盘,所以路径是D:\mavenRepository,先复制这个路径,后面会用到。

注意:压缩包和本地仓库路径都是要求使用非中文、没有空格的目录

Maven的配置

  • settings.xml文件配置

    打开上一步解压缩的文件中的conf文件夹中的settings.xml,里面的参数配置很重要,一定要配置。

setting.jpg 在文件里我们要完成三个改动

1. 本地仓库路径

就是上面的D:\mavenRepository,做法是在图中位置加上(大概56行)<localRepository>D:\mavenRepository</localRepository> D:\mavenRepository是自己设定的本地仓库路径

setting本地仓库.jpg

2. 阿里云镜像

阿里云提供的镜像仓库,访问国内网站,可以让Maven下载jar包的时候速度更快。配置的方式是:将下面mirror标签整体复制到mirrors标签的内部。

阿里云镜像.jpg

<mirrors>
    <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>central</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
</mirrors>

3. 配置Maven工程的基础JDK版本

配置的方式是:将profile标签整个复制到profiles标签内。(profile标签在mirrors标签下面)

<profiles>
    <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>
</profiles>
  • 环境变量的配置

完成上面的步骤之后,我们要进行环境变量的配置,步骤同配置jdk一样。

  1. 添加环境变量 MAVEN_HOME: 变量值是安装路径 环境变量.jpg
  2. 配置path

环境.jpg

配置环境变量的规律:

  • XXX_HOME指向的是bin目录的上一级
  • PATH指向的是bin目录
  1. 验证 输入mvn -version/mvn -v 验证.jpg 这里Maven就安装配置好了

三、Maven的仓库和坐标

仓库

Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。

仓库名称简介
本地仓库(local)在第一次执行 maven 命令的时候才被创建
中央仓库(central)这个仓库由 Maven 社区管理,不需要配置,需要通过网络才能访问地址:search.maven.org/#browserepo1.maven.org/maven2/
远程仓库(remote)在公司内部架设一台私服,其它公司架设一台仓库,对外公开。

坐标

坐标是为了让我们识别我们要管理项目的依赖的。

节点描述
groupId项目组织唯一的标识符,实际对应JAVA的包的结构 (一般写公司的组织名称。例如,一个银行组织 com.companyname.project-group 拥有所有的和银行相关的项目。
artifactId项目/工程的名称。
version这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本

四、在idea中集成Maven

  1. 配置maven软件的安装路径和本地仓库路径

tu001.png 2. 配置maven的runner参数

-DarchetypeCatalog=internal -Dfile.encoding=GB2312

tu_002.png

  • 参数一: -DarchetypeCatalog=internal 解决使用骨架构建Maven项目时候会卡住的问题
  • 参数二: -Dfile.encoding=GB2312 解决Maven工程中控制台输出中文乱码的问题

五、使用IDEA创建基于Maven的工程

创建JavaSE工程

1、 第一步

javase_001.png 2、 第二步

javase_002.png

创建JavaWeb工程

  1. 在IDEA中安装一个插件(JBLJavaToWeb)

javaweb.jpg 0. 按照创建javase工程的方式创建(此时创建出来的是javase工程) 0. 使用JBLJavaToWeb插件将javase工程转成javaweb工程

javaw.jpg

注意:转换之后会在main目录中多出一个web目录,并且pom.xml文件中会自动添加打包方式为<packaging>war<packaging/>

因为我们需要在javaweb项目中使用Servlet,所以需要引入Servlet的依赖

六、Maven构建命令(生命周期)

maven生命周期.jpg

阶段处理描述
清理 clean清除项目的构建的内容具体的效果是删除target目录
验证 validate验证项目验证项目是否正确且所有必须信息是可用的
编译 compile执行编译源代码编译在此阶段完成
测试 Test测试使用适当的单元测试框架(例如JUnit)运行测试。
包装 package打包创建JAR/WAR包如在 pom.xml 中定义提及的包
检查 verify检查对集成测试的结果进行检查,以保证质量达标
安装 install安装安装打包的项目到本地仓库,以供其他项目使用
部署 deploy部署拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程

七、Maven的依赖

1、依赖的范围

依赖.jpg 注意:只有运行时的依赖才会导到jar包或者web包里

2、依赖的传递性

依赖的传递性,是指A 依赖于B,B依赖于C,A依赖C。但C是否传递到A,取决于B依赖C时使用的依赖范围(上面说的运行时的依赖才会打包,这时候才可以传递),因此

  • B依赖C时使用compile和runtime范围:可以传递
  • B依赖C时使用test或provided范围:不能传递,所以需要这样的jar包时,就必须在需要的地方明确配置依赖才可以。

3、依赖的排除

当A依赖B,B依赖C而且C可以传递到A的时候,但是A不想要C,需要在A里面把C排除掉。而往往这种情况都是为了避免jar包之间的冲突。只需要在依赖里添加 ,如:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>4.2.4.RELEASE</version>
    <!--直接排除-->
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

八、继承和耦合

1、继承

在父工程中统一管理项目中的依赖信息,具体来说是管理依赖信息的版本,各个子工程使用依赖的时候版本就统一了,配置方法时:在子工程的pom.xml文件中通过<parent>标签指定当前子工程的父工程

<parent>
    <artifactId>maven-parent</artifactId>
    <groupId>org.example</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>

2、耦合

配置

2.1 在总工程的pom.xml中指定总工程的打包方式为pom
<groupId>com.atguigu</groupId>
<artifactId>maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
2.2 在总工程的pom.xml中指定总工程需要聚合的所有分工程
<modules>  
    <module>maven-child-01</module>
    <module>maven-child-02</module>
    <module>maven-child-03</module>
</modules>

3、实例

1、以创建Javase方式创建父工程maven-parent

1.1 在pom文件指定打包方式为pom

<groupId>com.atguigu.maven</groupId>
<artifactId>maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>

1.2 管理依赖信息,pom代码如下:

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

    <groupId>org.example</groupId>
    <artifactId>maven-parent</artifactId>
    <!--maven-parent工程,既是一个父工程,又是聚合里面的总工程
   打包方式为pom就表示它是聚合里面的总工程-->
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <!--自定义属性,进行版本锁定-->
        <spring.version>4.0.0.RELEASE</spring.version>
        <junit.version>4.12</junit.version>
    </properties>

    <!--用来描述当前总工程聚合了多少个子工程-->
    <modules>
        <module>maven-child01</module>
        <module>maven-child02</module>
        <module>maven-child03</module>
    </modules>

    <!--继承的效果:在父工程中管理依赖-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
                <scope>test</scope>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-expression</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>${spring.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>



</project>

版本锁定就是自定义一个属性,属性值就是要统一的版本,然后在<version>标签体中引入该属性值 2、创建三个子模块

a.jpg

2.1 指定parent为maven-parent

子.jpg 观察子工程的pom.xml文件可以看到,pom.xml文件中自动生成了<parent>标签用于指定父工程

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

观察父工程的pom.xml文件可以看到,pom.xml文件中自动生成了<modules>标签用于指定父工程聚合的所有子工程

<modules>
    <module>maven-child-01</module>
    <module>maven-child-02</module>
    <module>maven-child-03</module>
</modules>

2.2 在子工程中引入依赖

这是子工程2

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>maven-parent</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>maven-child02</artifactId>
    <packaging>jar</packaging>
    <dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>
    </dependencies>
</project>

后面就可以测试了,还可以在子工程1中依赖2,测试一下依赖的传递性。Maven大概就简单介绍这么多啦,请指教。