maven(一) maven究竟是个啥玩意~

      该篇文章篇幅很长,大概的思路以下html

          maven的介绍,初步认识,获取jar包的三个关键属性 --> 介绍仓库(获取的jar包从何而来)-->用命令行管理maven项目(建立maven项目) --> 用myeclipse建立maven项目 -->详细介绍pom.xml中的依赖关系(坐标获取、定位jar包的各类属性讲解。java

                              --WZYweb

 

1、简单的小问题?spring

    解释以前,提1个小问题。编程

      1.一、假如你正在Eclipse下开发两个Java项目,姑且把它们称为A、B,其中A项目中的一些功能依赖于B项目中的某些类,那么如何维系这种依赖关系的呢?api

        很简单,这不就是跟咱们以前写程序时同样吗,须要用哪一个项目中的哪些类,也就是用别人写好了的功能代码,导入jar包便可。因此这里也如此,能够将B项目打成jar包,而后在A项目的Library下导入B的jar文件,这样,A项目就能够调用B项目中的某些类了。缓存

        这样作几种缺陷tomcat

          若是在开发过程当中,发现B中的bug,则必须将B项目修改好,并从新将B打包并对A项目进行重编译操做app

          在完成A项目的开发后,为了保证A的正常运行,就须要依赖B(就像在使用某个jar包时必须依赖另一个jar同样),两种解决方案,第一种,选择将B打包入A中,第二种,将B也发布出去,等别人须要用A时,告诉开发者,想要用A就必须在导入Bjar包。两个都很麻烦,前者可能形成资源的浪费(好比,开发者可能正在开发依赖B的其它项目,B已经存储到本地了,在导入A的jar包的话,就有了两个B的jar),后者是咱们常遇到的,找各类jar包,很是麻烦(有了maven就不同了)框架

 

      1.二、咱们开发一个项目,或者作一个小demo,好比用SSH框架,那么咱们就必须将SSH框架所用的几十个依赖的jar包依次找出来并手动导入,超级繁琐。 

    

    上面两个问题的描述,其实都属于项目与项目之间依赖的问题[A项目使用SSH的全部jar,就说A项目依赖SSH],人为手动的去解决,很繁琐,也不方便,因此使用maven来帮咱们管理

 

2、maven究竟是什么?

    Maven是基于项目对象模型(POM project object model),能够经过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具[百度百科]

    这种又是大白话,若是没明白maven是什么,那么上面这句话跟没说同样,我本身以为,Maven的核心功能即是合理叙述项目间的依赖关系,通俗点讲,就是经过pom.xml文件的配置获取jar包,而不用手动去添加jar包,而这里pom.xml文件对于学了一点maven的人来讲,就有些熟悉了,怎么经过pom.xml的配置就能够获取到jar包呢?pom.xml配置文件从何而来?等等相似问题咱们须要搞清楚,若是须要使用pom.xml来获取jar包,那么首先该项目就必须为maven项目,maven项目能够这样去想,就是在java项目和web项目的上面包裹了一层maven,本质上java项目仍是java项目,web项目仍是web项目,可是包裹了maven以后,就可使用maven提供的一些功能了(经过pom.xml添加jar包)。

    因此,根据上一段的描述,咱们最终的目的就是学会如何在pom.xml中配置获取到咱们想要的jar包,在此以前咱们就必须了解如何建立maven项目,maven项目的结构是怎样,与普通java,web项目的区别在哪里,还有如何配置pom.xml获取到对应的jar包等等,这里提早了解一下咱们如何经过pom.xml文件获取到想要的jar的,具体后面会详细讲解该配置文件。

    pom.xml获取junit的jar包的编写。

          

    为何经过groupId、artifactId、version三个属性就能定位一个jar包?

        加入上面的pom.xml文件属于A项目,那么A项目确定是一个maven项目,经过上面这三个属性可以找到junit对应版本的jar包,那么junit项目确定也是一个maven项目,junit的maven项目中的pom.xml文件就会有三个标识符,好比像下图这样,而后别的maven项目就能经过这三个属性来找到junit项目的jar包了。因此,在每一个建立的maven项目时都会要求写上这三个属性值的。

          

        

         

 

3、maven的安装

    这一步maven环境的配置,我以为有必要安装一下,目的为了使用命令行建立maven项目,和使用命令行操做maven项目。这里不细讲,给出连接,跟安装jdk环境相似,maven的安装教程和配置

 还有注意,我如下用的是maven3.0.4版本(比较低的),大家能够下载最新的版本,最好是使用jdk1.7.

4、仓库的概念

    经过pom.xml中的配置,就可以获取到想要的jar包(还没讲解如何配置先须要了解一下仓库的概念),可是这些jar是在哪里呢?就是咱们从哪里获取到的这些jar包?答案就是仓库。

    仓库分为:本地仓库、第三方仓库(私服)、中央仓库

      4.一、本地仓库

          Maven会将工程中依赖的构件(Jar包)从远程下载到本机一个目录下管理,每一个电脑默认的仓库是在 $user.home/.m2/repository下

                  

              例如个人就在:C:\Users\Administrator\.m2\repository

          通常咱们会修改本地仓库位置,本身建立一个文件夹,在从网上下载一个拥有相对完整的全部jar包的结合,都丢到本地仓库中,而后每次写项目,直接从本地仓库里拿就好了

                这里面有不少各类各样咱们须要的jar包。

          修改本地库位置:在$MAVEN_HOME/conf/setting.xml文件中修改,

                

                

          D:\java\maven\repository:就是咱们本身建立的本地仓库,将网上下载的全部jar包,都丢到该目录下,咱们就能够直接经过maven的pom.xml文件直接拿。

 

      4.二、第三方仓库

          第三方仓库,又称为内部中心仓库,也称为私服

          私服:通常是由公司本身设立的,只为本公司内部共享使用。它既能够做为公司内部构件协做和存档,也可做为公用类库镜像缓存,减小在外部访问和下载的频率。(使用私服为了减小对中央仓库的访问

          私服可使用的是局域网,中央仓库必须使用外网

          也就是通常公司都会建立这种第三方仓库,保证项目开发时,项目所需用的jar都从该仓库中拿,每一个人的版本就都同样。

          注意:链接私服,须要单独配置。若是没有配置私服,默认不使用

 

      4.三、中央仓库

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

          这个公共仓库是由Maven本身维护,里面有大量的经常使用类库,并包含了世界上大部分流行的开源项目构件。目前是以java为主

          工程依赖的jar包若是本地仓库没有,默认从中央仓库下载

 

      总结:获取jar包的过程

              

 

5、使用命令行管理maven项目

      5.一、建立maven java项目

          本身建立一个文件夹,在该文件夹下按shift+右击,点开使用命令行模式,这样建立的maven[java]项目就在该文件夹下了。

          命令:mvn archetype:create -DgroupId=com.wuhao.maven.quickstart -DartifactId=simple -DarchetypeArtifactId=maven-archetype-quickstart

            mvn:核心命令

            archetype:create建立项目,如今maven高一点的版本都弃用了create命令而使用generate命令了。

            -DgroupId=com.wuhao.maven.quickstart :建立该maven项目时的groupId是什么,该做用在上面已经解释了。通常使用包名的写法。由于包名是用公司的域名的反写,独一无二

            -DartifactId=simple:建立该maven项目时的artifactId是什么,就是项目名称

            -DarchetypeArtifactId=maven-archetype-quickstart:表示建立的是[maven]java项目

           运行的前提:须要联网,必须上网下载一个小文件

                

          运行成功后

                  

          在D:\java\maven\demo下就会生成一个simple的文件,该文件就是咱们的maven java项目

                

      5.二、maven java项目结构

          simple
            ---pom.xml    核心配置,项目根下
            ---src
             ---main      
                  ---java    java源码目录
                    ---resources   java配置文件目录
             ---test
               ---java    测试源码目录
               ---resources   测试配置目录

          

          图中有一个target目录,是由于将该java项目进行了编译,src/main/java下的源代码就会编译成.class文件放入target目录中,target就是输出目录。

      5.三、建立 maven web 项目

          命令:mvn archetype:create -DgroupId=com.wuhao.maven.quickstart -DartifactId=myWebApp -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot

          其余都差很少,建立maven web项目的话 -DarchetypeArtifactId=maven-archetype-webapp 比建立java项目多了一个 -Dversion=0.01-snapshot, 在建立java项目的时候也能够加上这个,若是不写,会默认帮咱们加上1.0-snapshot。

              

           在D:\java\maven\demo下就会生成一个myWebApp的文件 

                  

      5.四、maven web项目结构

          pom.xml                 核心配置
          src/main/java                java源码
          src/main/resources            java配置
          src/main/webapp            myeclipse web项目中 WebRoot目录
                |-- WEB-INF
                   |-- web.xml
          src/test                    测试
          target                    输出目录

 

      5.五、命令操做maven java或web项目 

          编译:mvn compile  --src/main/java目录java源码编译生成class (target目录下)

          测试:mvn test    --src/test/java 目录编译

          清理:mvn clean    --删除target目录,也就是将class文件等删除

          打包:mvn package  --生成压缩文件:java项目#jar包;web项目#war包,也是放在target目录下

          安装:mvn install   --将压缩文件(jar或者war)上传到本地仓库

          部署|发布:mvn deploy  --将压缩文件上传私服

      5.六、例子:使用命令操做maven java项目

          注意:使用命令时,必须在maven java项目的根目录下,及能够看到pom.xml

          描述:将maven java项目打包上传到本地仓库供别人调用

            使用 mvn install

                

            在本地仓库中查看是否有该项目

                D:\java\maven\repository\com\wuhao\maven\quickstart\simple\1.0-SNAPSHOT

                

            经过在本地仓库中的目录能够发现为何经过groupId、artifactId、version能够定位到仓库中得jar包,也能够知道为何groupId要使用公司域名的反写(由于这样惟一,不会与别的项目重名致使查找到的内容不精确)

 

      5.7、maven项目的完整生命周期,当执行生命周期后面命令时,前面步骤的命令自动执行

                

          红色标记字体的意思就是当咱们直接使用mvn install命令对项目进行上传至本地仓库时,那么前面全部的步骤将会自动执行,好比源代码的编译,打包等等。

 

      5.八、其余命令

          maven java或web项目转换Eclipse工程

             mvn eclipse:eclipse

             mvn eclipse:clean  清楚eclipse设置信息,又从eclipse工程转换为maven原生项目了    

          ...转换IDEA工程

             mvn idea:idea

             mvn idea:clean  同上 

 

6、使用Myeclipse建立maven自定义项目

    使用myeclpse建立项目前,须要在myeclipse中配置maven的一些信息

      好比:配置本地仓库、安装自定义maven(myeclipse中高版本自带了maven)等,这里省略。

      6.一、java项目

          一、选择maven project,若是右键新建没有,经过other得到

              

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

              

          三、设置项目参数,建立java项目

              

              

              

          四、建立java项目结果

              

          

      6.二、建立maven web项目

          一、同上

          二、同上

          三、设置项目参数,其余同样,选择打包方式不同。

                

          四、建立web项目结果

                

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

                

             结果以下

                     

             而后须要更新一下项目,就不报错了。

                

 

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

                     

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

                    

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

                      

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

                  

              找到servle-jar包

                  

              pom.xml中检查,修改

                  

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

                    

 

      6.三、建立maven项目

          都同样,在项目参数那里修改便可

                  

          结果

                  

          maven项目通常没用,在开发中将一个项目拆分红多个项,就须要使用maven项目(pom项目)将其余子项目进行整合,下一章节讲解,很重要。很重要。

 

      6.四、myeclipse 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.五、例子,将maven web项目发布到tomcat运行

          命令:tomcat:run

                  

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

 

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

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

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

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

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

              

        步骤二:输入关键字查询得到须要内容,肯定须要版本

              

        

        步骤3、得到坐标

              

 

       方式二、使用本地仓库,经过myeclipse得到坐标

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

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

                

         步骤二:得到坐标

               

  

      7.二、依赖(坐标)的常见配置

         为了不不知道说的哪些配置属性,看下面图就明白了,就是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,以便咱们不会报错,因此,这两个很特殊。看图

               一、开发阶段(MyEclipse提供),看下图以此证实咱们说的

                  java web 5.0项目: 

                  java web 6.0项目:

               二、运行阶段(tomcat提供)   

                      

               因此,根据这个特色,若是使用maven开发项目,就不是web项目了,那么myeclipse就不会在给咱们提供这两个jar包,咱们就必须本身手动经过坐标从仓库中获取,可是针对上面的分析,当运行的时候,tomcat会帮咱们提供这两个jar包,因此咱们本身从仓库中获取的jar包就不能和tomcat中的冲突,那么就正好能够经过provided这个属性,来设置这两个jar的做用范围,就是在变异时期和测试时期生效便可。

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

    

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

 

      7.三、依赖调节原则

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

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

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

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

               使用X(2.0),由于其路径更近 

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

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

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

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

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

            

8、总结

      这篇文章的篇幅有点长,也消耗了我挺多的时间的,由于其中遇到一些bug,一直找不出缘由,一度想放弃,但仍是坚持了下来,这也只是maven的入门,知道大概怎么用,看别的应该就看得懂,其实项目中真正用的仍是下一节所要讲解的。

      如何搭建私服?

      如何从私服中获取jar包

      使用maven对父工程与子模块的拆分和聚合。

      下一节就讲这些东西把,加油。

相关文章
相关标签/搜索