zoukankan      html  css  js  c++  java
  • Maven学习总结

    一、Maven概念

    一个 基于Java平台自动化构建工具 ,帮助我们管理jar包和拆分项目,其他类似的构建工具有 make-ant-maven-gradle。

    基于Java平台:安装maven前一定要配置好JDK环境。

    自动化构建工具:eclipse就是自动化构建工具,帮助我们把java编译为class文件。

    二、Maven安装

    (1)下载JDK并配置环境变量。

    (2)下载maven(http://maven.apache.org/download.cgi)。

    (3)解压安装包,并配置maven环境变量。

      a、配置MAVEN_HOME : D:apache-maven-3.6.3

      b、配置path:%MAVEN_HOME%in

    命令行窗口下用 mvn -v 验证安装是否成功。

    以上三步就已经成功安装了maven,但为了让你的maven使用经历更加畅快,你还需要做出以下一些小修改。

    (1)增加Maven镜像

      Maven 仓库默认在国外, 国内使用难免很慢,我们可以更换为阿里云的仓库。

      Maven安装目录下,找 conf ----->settings.xml,在 mirrors 标签下加入下面内容

    <mirror>
             <!--This sends everything else to /public -->
             <id>nexus-aliyun</id>
             <mirrorOf>*</mirrorOf>
             <name>Nexus aliyun</name>
             <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>

    (2)修改本地仓库位置

      Maven默认本地仓库地址在C盘,随着项目的增加,这无疑会使得C盘变的臃肿,可以修改C盘的路径。

      Maven安装目录下,找 conf ----->settings.xml,修改 localRepository 标签中的地址到你开心的位置。

     <localRepository>F:/soft/MVN_repository</localRepository>

    (3)修改IDE的配置,使本地仓库生效

      Eclipse:Windows---->Preferences---->Maven---->User Settings---->Global Settings选择你之前配置的settings.xml

      Idea:File---->Other Settings---->Settings for new projects---->Maven---->Maven home directory选择Maven的安装目录,例如  D:apache-maven-3.6.3

         File---->Other Settings---->Settings for new projects---->Maven---->User settings file选择你之前配置的settings.xml

          

    三、Maven常用命令

    安装完成后,不要先着急使用,还有一些知识需要你进行了解,以便于你更好的使用Maven。

    Maven生命周期总的来分为clean,build,site三大部分,其中build又依次包括validate--->compile--->Test--->package--->verify--->install--->deploy,本篇文章比较偏向于实践,具体的生命周期的知识笔者不再赘述(生命周期的知识比较偏理论,但也挺重要的,还是希望大家自行了解下,https://www.runoob.com/maven/maven-build-life-cycle.html),生命周期的一些阶段对应着Maven的一些常用命令,

    命令描述
    mvn clean 删除target目录(删除编译文件的目录)
    mvn compile 只编译main目录中的java文件
    mvn test 执行test目录下的测试用例
    mvn package 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。
    mvn install 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖

    值得注意的是,每一个命令执行时,该命令之前以及包括该命令在内的所有命令都会被执行,比如执行了mvn install,前边的五条命令也都会被执行。

    四、POM文件

    为了方便理解,先对常见的pom文件结构进行讲解,掌握了下边的文件结构,基本上你就可以关掉本篇博文,使用maven进行开发了,但如果你对此并不满足,可以继续向下看。

    <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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <!--声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变,
      虽然如此,但它仍然是必不可少的,这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。 -->
        <modelVersion>4.0.0</modelVersion>
        <!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成,
       如com.liu.learning,maven会将该项目打成的jar包放本地仓库下的:/com/liu/learning 目录下下-->
        <groupId>com.liu.learning</groupId>
        <!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
        <artifactId>HelloWorld01</artifactId>
        <!-- 版本号 -->
        <version>0.0.1-SNAPSHOT</version>
        <!--项目的名称, Maven产生的文档用 -->
        <name>HelloWorld01</name>
        <!--项目产生的构件类型,例如jar、war、ear、pom。 -->
        <packaging>jar</packaging>
        <!--项目描述 -->
        <description>hello world</description><!-- 统一JDK版本 -->
        <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><dependencies>
            <!-- https://mvnrepository.com/artifact/junit/junit -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <!-- jar包的作用范围,相关知识会摘出来单独讲解 -->
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <!--  下边还是配置远程仓库镜像  -->
        <!--  如果你不想在conf.xml配置国内镜像,又想高速下载jar包时,那你就只能每次都手动加入如下配置  -->
        <repositories>
            <repository>
                <id>public</id>
                <name>aliyun nexus</name>
                <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
            </repository>
        </repositories>
        <!--如果你只配置了repositories,你会发现在下载依赖时,一部分从阿里云下载,
        一部分(插件部分)还是从默认的仓库下载,所以你还要配置插件的远程仓库地址,
        那么这个插件又是什么东西呢,可以看下方图片粗略了解下-->
        <pluginRepositories>
            <pluginRepository>
                <id>public</id>
                <name>aliyun nexus</name>
                <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </pluginRepository>
        </pluginRepositories>
    </project>

     

    五、jar包的作用范围scope

    常用的三个分别是compile,test,provided 作用范围如下表:

    阶段 scopecompiletestprovided
    编译 ×
    测试
    部署(运行) × ×

    1、compile

      缺省值,如果不显式声明默认为compile,适用于所有阶段,会随着项目一起发布。

    2、test

      jar包只在测试阶段需要,常见的jar比如说junit

    3、provided

      jar包只在编译和测试时需要,这种比较少见,比如说servlet-api.jar,编译和测试时需要servlet 环境,但运行时由tomcat提供servlet环境,就不需要servlet-api.jar了

    六、Maven依赖与依赖排除

    1、Maven自动引入依赖

    假如说我们需要用到A.jar,但是A.jar中又用到了B.jar,Maven会自动帮我们引入B.jar,最常见的例子就是spring-context.jar 了,大家可以自行尝试将下边依赖引入,Maven不仅会将spring-context.jar引入,还会将spring-aop.jar,spring-beans.jar等其他jar包一并引入。

     <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-context</artifactId>
                 <version>5.2.6.RELEASE</version>
     </dependency>

     2、依赖排除的两种方案

    但如果我们确实用不到其他jar但Maven又帮我们引入了,那该怎们办呢?

    <!-- 方法一 -->
     <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-context</artifactId>
                 <version>5.2.6.RELEASE</version>
                 <exclusions>
                     <exclusion>
                         <groupId>org.springframework</groupId>
                         <artifactId>spring-core</artifactId>
                     </exclusion>
                     <exclusion>
                         <groupId>org.springframework</groupId>
                         <artifactId>spring-beans</artifactId>
                     </exclusion>
                     <exclusion>
                         <groupId>org.springframework</groupId>
                         <artifactId>spring-aop</artifactId>
                     </exclusion>
                 </exclusions>
     </dependency><!-- 方法二 --><dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-context</artifactId>
                 <version>5.2.6.RELEASE</version>
                 <exclusions>
                     <exclusion>
                         <groupId>*</groupId>
                         <artifactId>*</artifactId>
                     </exclusion>
                 </exclusions>
     </dependency>

    七、Maven依赖传递与依赖原则

    1、依赖传递

    在数学上,若A依赖于B,B依赖于C,那么A依赖于C成立,但在Maven中还需要添加一个条件,要使 A.jar依赖于C.jar,当且仅当 B.jar 依赖于C.jar的范围是compile

    创建maven项目A,B,其中B中引入junit.jar,然后将B用mvn install安装到本地仓库,再将B引入到A,改变junit的scope观察A中是否引入junit。

    实验过程如上,读者可自行实验。

    2、依赖原则

    我们再来看下边三个案例,

    (1)同一POM中引入同一jar包的不同版本时(不推荐这样做),会使用哪个版本呢?

    (2)项目A->B,B->junit.jar(scope为compile),同时A->junit.jar,那么A中又会使用哪个jar呢?

    (3)项目A依赖B和C,B和C都依赖了不同版本的junit.jar(scope为compile),那么A中会使用哪个jar呢?

    前两个很好猜,第一个pom文件写在后边的jar会覆盖前边的jar。第二个会选择离自己最近的jar,也就是A中自己的jar。第三个同时也遵循 离自己最近的原则,但是两者距离一样,那怎么办呢?POM文件中对B和C的依赖声明总有先后顺序吧,那就采用先声明那个中的jar。

    我们抛去第一个案例(开发中严禁这样做),来总结下规则:

    (1)路径最近者优先。

    (2)第一声明者优先。

    八、Maven依赖继承

    1、父项目

    <!-- 第一步:父项目必须声明为pom -->
     <packaging>pom</packaging>

    <!-- 第二步:dependencies外层套上dependencyManagement --> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>compile</scope> </dependency> </dependencies> </dependencyManagement>

    2、子项目

    <!-- 第一步:引入父项目的坐标 -->
     <parent>
             <groupId>com.liu.learing</groupId>
             <artifactId>parent</artifactId>
             <version>0.0.1-SNAPSHOT</version>
             <!-- 当前工程的Pom.xml到父工程的Pom.xml之间的 相对路径   默认值为  ../pom.xml--> 
             <!-- 父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是../pom.xml。Maven首先在
      构建当前项目的地方寻找父项 目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后
      在远程仓库寻找父项目的pom。
    --> <relativePath>../parent/pom.xml</relativePath> </parent><!-- 第二步:写出要用到父项目的jar包名称,不用写版本号 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies>

    九、项目聚合

    Maven项目能够识别自身和本地仓库中的项目,如果项目A依赖项目B,必须要把项目B进行打包安装放入本地仓库,然后再在项目A中引入才能使用。但是如果项目A依赖很多个其他项目,这样一一打包安装就比较麻烦了,这就引出了“聚合”。

     <!-- 第一步:总项目必须声明为pom -->
     <packaging>pom</packaging><!-- 
     第二步:总项目引入子项目地址,子项目 相对 总项目pom文件 的 相对地址(就是以总项目的pom文件为起点,去找子项目)
      注意:这里是 子项目 而不是 子项目的pom文件相对总项目pom文件 ,这一点和依赖继承不同
     --> 
     <modules>
             <module>../one</module>
             <module>../two</module>
     </modules>
    
     <!-- 然后子项目就可以正常互相引用,而省去了install的步骤 -->

    十、统一管理版本

    有时候开发项目过程会遇到版本号统一升级的问题,例如junit版本从3.0版本升级成4.12版 这个时候有两个处理办法

    1、原始方案

    在pom文件里统一 ctrl+f 搜索替换一下。

    2、高级方案

    使用pom里的properties标签,自定义一个 xxx 标签,标签内就是版本号,在需要使用的地方使用 ${xxx} 灵活取出上面定义的值,这个样子就不用那样修改多个地方啦!

      <properties>
             <junit>4.12</junit>
      </properties><dependencies>
             <dependency>
                 <groupId>junit</groupId>
                 <artifactId>junit</artifactId>
                 <version>${junit}</version>
                 <scope>compile</scope>
             </dependency>
         </dependencies>
    学习和码字过程难免出现疏漏,欢迎指正!QQ:1801888312
  • 相关阅读:
    4-Python3从入门到实战—基础之数据类型(字符串-String)
    3-Python3从入门到实战—基础之数据类型(数字-Number)
    前端工程化—部署
    前端工程化
    PHP与MySQL设计模式:代理模式
    移动前端开发入门(一)
    PHP页面间传值的几种方法
    PHP文件上传及下载源码
    PHP文件操作
    JavaScript正则表达式
  • 原文地址:https://www.cnblogs.com/liuguo/p/13531050.html
Copyright © 2011-2022 走看看