zoukankan      html  css  js  c++  java
  • Maven专题

    1:什么是Maven

      Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具

      上述这话是官方话语,说了就等于没说,但是我自己对于maven的理解,Maven就是用于合理合当就梳理项目之间的关系,众所周知,我们无论开发项目还是写一个小demo,都需要依赖jar,但是这些jar其实就是一个项目,只是把项目打成了jar而已,既然我们需要那么多的jar,那么如果手工的去添加jar,是会很繁琐的所以就用到了Maven,Maven就是通过pom.xml文件的配置来获取jar包,不需要手动的去添加,

      讲到这里,那么问题又来了,pom.xml文件是什么文件呢,这个文件又是从何而来的,这个文件如何配置才能获取jar包呢,请不要着急,待我慢慢道来!

      上述的一切都是基于maven为前提的,所以我们首先就要下载,安装,并且配置好maven的环境!

    2maven的配置与环境搭配

      熟悉java的人都知道,在安装jdk的时候需要在环境变量里面建JAVA_HOME,同样的道理,maven也是需要的,,那么话不多说,下面就详细介绍maven的配置和环境搭配

      首先肯定需要下载Maven的安装包    前往https://maven.apache.org/download.cgi下载最新版的Maven程序:

      下载最新版的安装包之后解压在文件中,结果如下图所示

    复制上面的路径,在环境变量中新建MAVEN_HOME,将路径填入

    编辑path环境变量,在最后面追加%MAVEN_HOME%in;

    cmd进入命令行输入 mvn -v 查看是否配置成功

    3 通过pom.xml文件获取jar

    我们的pom.xml里面都会有这一段,分别意思为:

    groupId:给自己唯一的一个标识;

    artifactId:项目名称

    version:版本号

    packageing:打包后打包成什么包

    这是对自己的标识,方便自己被打成jar包供别人使用,

    下面来讲一下在pom.xml文件中获取其他的jar包

    <dependencies>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>//一般是包名,就是表示唯一的那个
                <artifactId>mybatis-spring-boot-starter</artifactId>项目名
                <version>1.2.0</version>版本号
            </dependency>
    ...
    ...
    ...
    ...
    <dependencies>

    所以我们通过

    groupId,artifactId,version这个三个值就能确定一个jar包,(详细情况请听下回分解)

     4,仓库

    第三点钟提到了利用pom.xml文件可以获取到jar包,那么jar到底是在哪里获取的呢,一般会有三个地方    本地,私服,中央仓库

      本地

     我们将可以需要到的jar都集合起来再建个文件夹下存在本地计算机中,那么就可以通过maven的pom.xml文件来拿了

      私服,第三方服务器

    一般为公司局域网所有,连接私服需要单独配置

      中央仓库

    Maven内置了远程公用仓库:http://repo1.maven.org/maven2

    那么取本地的的jar是如何能让pom.xml文件去指定的文件下取jar包呢(私服的省略)

    在这个文件夹下有这个settings.xml文件,这个文件里有

    <localRepository>/path/to/local/repo</localRepository>
    这行代码是默认注释掉的,将他拿出来,并且将值改成你们指定的jar包所在的路径

     (建议保留原版,复制原版到上一层文件夹或下一层文件夹)

    那么这个取jar包的顺序是什么呢

     5在eclipse中创建项目

              打开Window->Preferences->Maven->Installations,右侧点击Add

     

     home选择maven的路径,name填写姓名点击finish,最后选中你add进来的maven,apply即可

        点击User Settings 其中User Settings就是上面所说的建议复制到上一层或者下一层的那个settings.xml文件的路径,下面的Local Repository就是本地仓库的路径

          

              

    使用eclipse创建maven自定义项目

        

          java项目

              1、选择maven project,如果右键新建没有,通过other获得

                  

              2、创建一个简单项目(跳过骨架选择)

                  

              3、设置项目参数,创建java项目

                  

                  

                  

              4、创建java项目结果

                  

              

         创建maven web项目

              1、同上

              2、同上

              3、设置项目参数,其他一样,选择打包方式不一样。

                    

              4、创建web项目结果

                    

              5、可能报错1:pom.xml报错

                    

                 结果如下

                         

                 然后需要更新一下项目,就不报错了。

                    

              6、报错2,编写jsp时报错

                         

                错误信息为缺少serlvet-jar和jsp-jar包

                        

                解决:使用pom.xml定位导入相应的jar包

                          

                  找到jsp-jar包,scope的作用是表示该jar包的作用范围,provided表示在编译和测试期有效,在运行期则无效。具体后面讲解pom.xml时会讲解到。     

                      

                  找到servle-jar包

                      

                  pom.xml中检查,修改

                      

                  修改完后,发现两个jar包都加载进来了,项目完好,不在报错了。

                        

      

      eclipse maven操作

                      

            6--9 都是快捷方式

              9 测试,相当于命令行 mvn test

              8 安装,相当于命令行 mvn install  作用:将其上传到本地仓库,具体见上面讲解

              7 关联源码,这个不需要解释吧,平常我们使用别的jar包也关联过源码

              6 清理,mvn clean

            5 maven bulid  执行maven命令,等效 mvn

                      

            4 maven build  5快速的操作

              如果没有操作过,与5相同

              如果操作过一次,将直接执行上一次5的命令

              如果操作多次,将提供选择框

          6.5、例子,将maven web项目发布到tomcat运行

              命令:tomcat:run

                      

              通过网址即可访问,同时会将该项目上传到本地仓库。

    pom.xml的依赖关系讲解(重点)

        之前一直在使用pom.xml中找jar包最关键的三个属性,groupId、artifactId、version,应该有些印象了,也知道为什么通过这三个能找到对应的jar包,但是没有细讲其中的一些小的知识点,比如上面添加servlet-jar和jsp-jar的依赖时,出现的一些属性就不太懂,所以,这一章节,就将依赖关系全面分析。

        如何获取坐标(也就是三个关键属性值)

          方式1:使用网站搜索[从中央仓库拿]

            步骤一:百度搜索关键字“maven repository”

                  

            步骤二:输入关键字查询获得需要内容,确定需要版本

                  

            

            步骤三、获得坐标

                  

           方式2、使用本地仓库,通过eclipse获得坐标

             上面已经介绍过了如何从本地仓库获取对应jar,这里在简单阐述一下

             步骤一:添加依赖,pom.xml文件中,右键  

                    

             步骤二:获得坐标

                   

      

         依赖(坐标)的常见配置

             为了避免不知道说的哪些配置属性,看下面图就明白了,就是dependency下的属性配置,全部有9个,讲其中的7个。

                    

             groupId、artifactId、version是依赖的基本坐标,缺一不可,这三个可以不用将,都知道,重要的是除了这三个之外的配置属性需要我们理解

             type:依赖的类型,比如是jar包还是war包等

                默认为jar,表示依赖的jar包

                注意:<type>pom.lastUpdated</type> 这个我们在上面添加servlet-jar的时候就遇到过,看到lastUpdated的意思是表示使用更新描述信息,占位符作用,通俗点讲,选择该类型,jar包不会被加载进来,只是将该jar包的一些描述信息加载进来,使别的jar包在引用他时,能够看到一些相关的提示信息,仅此而已,所以说他是个占位符,只要记住他的jar包不会被加载进来。

             optional:标记依赖是否可选。默认值false

                比如struts2中内置了log4j这个记录日志的功能,就是将log4j内嵌入struts2的jar包中,而struts2有没有log4j这个东西都没关系,有它,提示的信息更多,没它,也能够运行,只是提示的信息就相对而言少一些,所以这个时候,就可以对它进行可选操作,想要它就要,不想要,就设置为false。

             exclusions:排除传递依赖,解决jar冲突问题

                依赖传递的意思就是,A项目 依赖 B项目,B项目 依赖 C项目,当使用A项目时,就会把B也给加载进来,这是传递依赖,依次类推,C也会因此给加载进来。

                这个有依赖传递有好处,也有坏处,坏处就是jar包的冲突问题,比如,A 依赖 B(B的版本为1),C 依赖 B(B的版本为2),如果一个项目同时需要A和C,那么A,C都会传递依赖将B给加载进来,问题就在这里,两个B的版本不一样,将两个都加载进去就会引起冲突,这时候就需要使用exclusions这个属性配置了。maven也会有一个机制避免两个都加载进去,maven 默认配置在前面的优先使用,但是我们还是需要使用exclusions来配置更合理,这里使用spring bean 和 struts2 spring plugin 来举例子说明这个问题并使用exclusions解决这个问题。(spring bean 和 struts2 spring plugin都需要依赖spring-core,但版本不一样)

                从本地仓库中找到这两个jar包

                      

                maven自己的解决方案如下

                  maven 默认配置在前面的优先使用,下面是证明

                    先将spring-beans加载进去的,所以会将spring-beans依赖的spring-core的版本加载进来。

                                 

                    先将struts2-spring-plugin加载进来,那么就会将其依赖的spring-core的版本加载进来

                          

                  

                使用exclusions来配置

                   即使struts2-spring-plugin 配置在前面,也需要使用3.2.0版本。则需要为struts2-spring-plugin 排除依赖(不使用3.0.5依赖)

                         

                   注意:这样,就将struts2-spring-plugin依赖的spring-core的版本排除依赖了,也就是该依赖的spring-core不会在加载进来,查看代码,看是否符合要求,如果不符合要求,需要手动的修改 

                        

             scope:依赖范围,意思就是通过pom.xml加载进来的jar包,来什么范围内使用生效,范围包括编译时,运行时,测试时

                        

                compile:默认值,如果选择此值,表示编译、测试和运行都使用当前jar

                test:表示只在测试时当前jar生效,在别的范围内就不能使用该jar包。例如:junit 。此处不写也不报错,因为默认是compile,compile包扩了测试

                runtime,表示测试和运行时使用当前jar,编译时不用该jar包。例如:JDBC驱动。JDBC驱动,在编译时(也就是我们写代码的时候都是采用接口编程,压根就没使用到JDBC驱动包内任何东西,只有在运行时才用的到,所以这个是典型的使用runtime这个值的例子),此处不写也不报错,理由同上

                provided,表示编译和测试时使用当前jar,运行时不在使用该jar了。例如:servlet-api、jsp-api等。【必须填写】

                   什么意思呢? 在我们以前创建web工程,编写servlet或者jsp时,就没导入过jar包把,因为myeclipse或者别的ide帮我们提供了这两个jar包,内置了,所以我们在编译期测试期使用servlet都不会报缺少jar包的错误,而在运行时期,离开了myeclipse或别的ide,就相当于缺失了这两个jar包,但此时tomcat又会帮我们提供这两个jar,以便我们不会报错,所以,这两个很特殊。看图

                   1、开发阶段(MyEclipse提供),看下图以此证明我们说的

                      java web 5.0项目: 

                      java web 6.0项目:

                   2、运行阶段(tomcat提供)   

                          

                   所以,根据这个特点,如果使用maven开发项目,就不是web项目了,那么myeclipse就不会在给我们提供这两个jar包,我们就必须自己手动通过坐标从仓库中获取,但是针对上面的分析,当运行的时候,tomcat会帮我们提供这两个jar包,所以我们自己从仓库中获取的jar包就不能和tomcat中的冲突,那么就正好可以通过provided这个属性,来设置这两个jar的作用范围,就是在变异时期和测试时期生效即可。

                   这个例子就可以解释上面创建maven web时产生的错误和解决方案了。

        

                system:表示我们自己手动加入的jar包,不属于maven仓库(本地,第三方等),属于别得类库的这样的jar包,只在编译和测试期生效,运行时无效。一般不用                    

          7.3、依赖调节原则

              这个就是maven解决传递依赖时jar包冲突问题的方法,按照两种原则,上面已经介绍了一种了,就是下面的第二原则

                1、第一原则:路径近者优先原则

                        A-->B-->C-->D-->X(1.6)

                        E-->D-->X(2.0)

                   使用X(2.0),因为其路径更近 

                2、第二原则:第一声明者优先原则。就是如果路径相同,maven 默认配置在前面的优先使用

                        A-->B --> X(1.6)

                        C-->D--> X(2.0)

                   这样就是路径相同,那么如果A在前面,C在后面,则使用X(1.6)

                maven会先根据第一原则进行选择,第一原则不成,则按第二原则处理。

    <参照>https://www.cnblogs.com/whgk/p/7112560.html<参照>

  • 相关阅读:
    day59_BOS项目_11
    day58_BOS项目_10
    shell 笔记
    docker + swarm 集群
    HDFS深入浅析
    FTP服务器常规操作
    linux shell 流程控制
    认识黑客常用的入侵方法
    Linux中常用的查看系统信息的命令
    解决Yum安装依赖问题
  • 原文地址:https://www.cnblogs.com/1a2b/p/8954232.html
Copyright © 2011-2022 走看看