Maven (一)--- 入门和依赖

部分图片来自参考资料

问题 :

- maven 生命周期是怎么样的

- mvn clean install 与 mvn clean deploy 的区别是什么

 

概述

        Maven 是一种构建项目的工具,能够帮我们自动化构建过程,从清理,测试到生成报告,再到打包和部署,不仅如此它还是一个依赖管理工具和项目信息管理工具,它提供了中央仓库,能帮我们自动下载构件。

 

Maven 安装注意事项

        Maven 安装的教程我就不再重复讲解,主要就是先安装JDK,然后配置环境变量,正常安装即刻。Maven 用户可以选择配置 安装路径下/conf/settings.xml 或是 ~/.m2/settings.xml ,前者是全局范围,后者是用户返回,只有当前用户才会受影响。例如,在我的电脑中,前后者的路径分别为 :

E:\software\maven\apache-maven-3.5.4-bin\apache-maven-3.5.4\conf

C:\Users\Benjious\.m2\repository

 

示例 maven 文件

 



    4.0.0

    com.general
    general-msg
    pom
    1.0-SNAPSHOT
    
        general-msg-api
        general-msg-bit
    

    
        org.springframework.boot
        spring-boot-starter-parent
        1.4.2.RELEASE
    

    
        1.8
        3.3.1
        1.2.4
        5.1.40
        2.8.4
        1.4.2.RELEASE
        1.2.2.RELEASE
        2.0.3.RELEASE
    

    
        
            
                org.springframework.boot
                spring-boot-starter-web
                ${spring.boot.version}
                
                
                
                
                
                
            

          
            
            
                com.alibaba
                dubbo
                2.5.3
                
                    
                        org.springframework
                        spring
                    
                
            
			
			
            
                org.apache.zookeeper
                zookeeper
                3.4.6
                
                    
                        org.slf4j
                        slf4j-log4j12
                    
                    
                        log4j
                        log4j
                    
                
            
			
			
            
                com.github.sgroschupf
                zkclient
                0.1
            

          
         
            
                org.apache.commons
                commons-lang3
                3.4
            

            
            
                mysql
                mysql-connector-java
                ${mysql.connector.version}
            
			
            
                org.mybatis
                mybatis
                ${mybatis.version}
            
			
            
                org.mybatis
                mybatis-spring
                ${mybatis.spring.version}
            
            

            
            
                org.mybatis.generator
                mybatis-generator-core
                1.3.2
                compile
                true
            

           



        
    

    
        
        
            nexus-releases
            Nexus Release Repository
            http://192.168.10.241:8081/repository/maven-releases/
        
        
            nexus-snapshots
            Nexus Snapshot Repository
            http://192.168.10.241:8081/repository/maven-snapshots/
        
    
    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                
                    1.8
                    1.8
                
            
            
            
                org.apache.maven.plugins
                maven-source-plugin
                2.4
                
                    
                        attach-sources
                        
                            jar-no-fork
                        
                    
                
                
                    true
                
            
        
    

 

 

初步实践

        我们先使用maven构建一个简单的项目,新建文件和文件夹如下图 ,test 文件夹和main 文件夹同级。

Maven (一)--- 入门和依赖_第1张图片

         以下是 Main.java 文件和 pom.xml 文件。

package com.vb.bengmall;
public class Main{
	public  String sayHello(){
		return "Hello Maven";
	}

	public static void main(String[] args){
		System.out.print(new Main().sayHello());
	}
}
 


    4.0.0
    com.vb.bengmall
    bengmall
    1.0-SNAPSHOT
    Maven Hello World Project
    
        
            junit
            junit
            4.12
        
    


         还有test测试文件 :

import com.vb.bengmall.Main;

import static org.junit.Assert.assertEquals;

import org.junit.Test;

public class MainTest {
    @Test
    public void testSayHello() {
        Main m = new Main();
        String result = m.sayHello();
        assertEquals("Hello Maven",result);
    }
}

      然后在src 目录下依次执行 : mvn clean  compile 和 mvn clean test ,就会发现 src 生成了一个 target目录,里面就是我们编译和测试生成的文件,执行过程如图 :

Maven (一)--- 入门和依赖_第2张图片

      接下来是 mvn clean package  ,我们看到执行日志,maven 执行的是插件的 clean ,resources,compiles,testResources,testCompile,test ,jar 几个步骤,我们后面再详细学习这几个过程,现在打开target 文件夹下你就会发现里面有个jar,这正是我们打包出来的jar 文件,好了,打包成功后,我们需要将项目放在maven 仓库中,方便以后其他项目引用,这里就要执行 mvn clean install

打开以下路径(见下图),你就发现自己项目生成的jar放在了maven 仓库中了。

Maven (一)--- 入门和依赖_第3张图片

       要是每次构建项目都要自己建文件夹,配置pom 难免有些繁琐麻烦,maven 也提供一些骨架供大家下载使用,执行mvn archetype:generate 命令,maven就会弹出来让你选择哪种框架,选择后就会让你填写 groupid等等基本信息,然后生成一个开发骨架。

       通过上面的小实例,我们从compile ,test ,package 到最后的install 我们相当于把构建项目的过程走了一遍,当然实际中可能需要更多的步骤,以上步骤是让读者对maven 有个初步的印象。

   

依赖

maven 坐标

        maven 通过定义groupId, artifactId, version , packaging , classifier 。在maven的世界里,任何一个依赖,插件或者项目构建的输出,都可以称为构件。 坐标详解:

  • groupId : 定义当前 Maven 项目隶属的实际项目。
  • artifactId :  该元素定义实际项目中的一个 Maven 项目(模块),推荐的做法是使用实际项目名称作为 artifactId 的前缀。
  • version : 版本,需要注意快照版本(SNAPSHOT)的学习和理解
  • packaging : 打包方式
  • classifier : 该元素用来帮助定义构建输出一些附属构件。

依赖配置


	
		
			...
			...
			...
			...
			...
			...
			
				...
			
		

		
			...
		

		
			...
		
	


       groupId , artifaceId , version 三者可以定义一个依赖的坐标,另外的配置 :

  • type : 依赖的类型,大部分不必声明。
  • scope :  依赖范围,下文详解
  • optional  : 少用
  • exclusions : 用来排除传递性依赖

依赖的范围有

  •  compile : 没指定,默认是这个范围
  •  test : 测试范围,在编译主代码或者运行项目的时候无法使用该类依赖
  •  provided : 在编译和测试有效,但在运行中无效,典型的就是 servlet-api , 编译和测试项目的时候是需要该依赖的,但在运行时由于容器有提供这不需要。
  •  runtime : 测试和运行有效,但在编译主代码时无效。典型的就是 JDBC 驱动实现了,项目编译只要 JDK 提供的JDBC 接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC 驱动。
  •  system : 系统依赖范围,和provided 依赖范围完全一致,由于该类依赖不是通过maven 仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,应谨慎使用。
  •  import : 后面介绍

 

Maven (一)--- 入门和依赖_第4张图片

 

传递性依赖和传递性的依赖范围

         假如我们有一个叫 account-email 的项目,依赖如下 :

Maven (一)--- 入门和依赖_第5张图片

        那么 account-email 和 commons-logging 之间就存在一个传递性依赖。具体的依赖类型如下图 :

Maven (一)--- 入门和依赖_第6张图片

依赖调解

        对于依赖有两个重要的原则 :

  • 路径最近者优先
  • 第一声明者优先

 

最佳实践

       排除依赖,例如由于传递性依赖中引入了不稳定的SNAPSHOT版本依赖,现在想把它移除掉,

Maven (一)--- 入门和依赖_第7张图片

      pom 文件示例如下 :

  
        
            
                com.juvenxu.mvnbook
                project-b
                ${spring.boot.version}
                
                    
                        org.springframework.boot
                        spring-boot-starter-tomcat
                    
                
            
            ....
  

         查看当前 maven 中已经解析的依赖 :

  mvn  dependency:list

仓库

        maven 仓库是基于简单文件系统存储的,例如在我们的logback 这个构件存在在我们本地仓库的位置。如下图 :

 

Maven (一)--- 入门和依赖_第8张图片

      不同版本的logback 以文件的形式在本地存储。

仓库分类

Maven (一)--- 入门和依赖_第9张图片

               可以知道大体分为远程仓库和本地仓库两类。

 

本地仓库

          本地仓库的地址默认是 ~/.m2/resposity  ,我们可以通过 setting.xml 文件来进行修改 。


	D:\java\repository\

        

私服

Maven (一)--- 入门和依赖_第10张图片

       可以说私服就像是浏览器一样,帮助客户请求远程服务器的资源,用户也可以上传和下载构件。

远程仓库

       mvn clean deploy 就是将项目部署到远程仓库中去,在本篇的示例代码中,部署到远程仓库中的配置如下 :


        
        
            nexus-releases
            Nexus Release Repository
            http://192.168.10.241:8081/repository/maven-releases/
        
        
            nexus-snapshots
            Nexus Snapshot Repository
            http://192.168.10.241:8081/repository/maven-snapshots/
        
    

        

生命周期

       可以说maven 构建项目的过程分为 : 编译,测试,打包,部署。而maven 本身有三套独立的生命周期,分别为 : clean(清理项目),default(构建项目),site(建立项目站点) 。

插件

       插件的执行实际就是声明周期的过程,插件与生命周期有一个绑定的关系,例如 :

Maven (一)--- 入门和依赖_第11张图片

 

Maven (一)--- 入门和依赖_第12张图片

 

聚合与继承

聚合

      聚合的作用主要是使编译的时候一起编译。

    
        general-msg-api
        general-msg-bit
    

         

继承

     继承的作用主要是让子类省去一些重复的工作。

    
        general-msg
        com.general
        1.0-SNAPSHOT
    

     可继承的属性有

Maven (一)--- 入门和依赖_第13张图片Maven (一)--- 入门和依赖_第14张图片

依赖管理

           我们从上面也可以知道 dependencies 和 dependencyManagement 都是可从父类中继承的,例如在父类的 dependencyManagement 中定义的

            
                org.springframework.boot
                spring-boot-starter-web
                ${spring.boot.version}
            

            
                org.springframework.boot
                spring-boot-starter-jdbc
                ${spring.boot.version}
            

          在子类中可以直接省略了版本号,这样也方便项目管理,使得多个子类和父类都使用同一个版本,不会造成混乱。

         
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-jdbc
        

        maven 提供的 dependencyManagement 元素既能让子模块继承到福模块的依赖配置,又能保证子模块依赖使用的灵活性。在 dependencyManagement  元素下的依赖声明不会不会引入实际的依赖,不过它能够约束 dependencies 下的依赖使用。

 

问题

  • mvn clean install 与 mvn clean deploy 的区别是什么

Maven (一)--- 入门和依赖_第15张图片

Maven (一)--- 入门和依赖_第16张图片

 

总结

        本文主要介绍maven 的工作过程,需要重点把握的是maven的生命周期和继承聚合以及依赖的相关概念,在学习中最好结合文章开头的实例进行比对学习。

参考资料

  • maven 实战
  • 工匠人生公众号 --- 【朝花夕拾】Maven拾遗  一文

 

转载于:https://www.cnblogs.com/Benjious/p/10947069.html

你可能感兴趣的:(Maven (一)--- 入门和依赖)