maven学习总结

Maven常用命令:

  • 项目编译:mvn clean compile 或者 clean compile -U
  • 项目打包:mvn clean package
  • 执行测试:mvn clean test
  • 安装到本地仓库:mvn clean install
  • 创建项目骨架:mvn archetype:generate

小技巧

  • 检查jar包冲突命令:mvn -X compile dependency:tree -Dverbose >a.log
    执行此命令可以检查Jar包版本冲突:mvn -X compile dependency:tree -Dverbose >a.log,然后在a.log文件里查找 是否有”omitted for conflict with”,如果有,则表示jar包有版本冲突 ;
    注意:有版本冲突的也会显示编译成功的。(mvn dependency:tree -Dverbose | grep “omitted for conflict with” )
    根据提示的冲突,修改pom文件,即将冲突的jar包管理起来,在节点中加入冲突的依赖包,并确认版本。
    所有依赖的版本号应使用dependencyManagement 显示管理,若要引用依赖,需在dependencyManagement 下面写上该依赖的dependency,不用再写version。

一、Maven座标和依赖

Maven仓库的布局,说白了就是唯一路径。

  • 座标
    Maven座标为各种构件引入了执行,任何一个构件都必须明确定义自己的座标,一组maven座标通过一些元素定义,分别是groupId,artifactId,version,packaging,classifier,如下
<groupId>com.lesserPanda.interfaces</groupId>
<artifactId>mobile</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>

1、groupId:定义maven项目隶属的实际项目,一般域名反过来,如:com.lesserPanda
2、artifactId:该元素定义实际项目中的一个maven项目(模块),推荐做法是使用实际项目名称作为artifactId的前缀。
3、version:该元素定义maven项目当前所处的版本。
4、packaging:该元素定义maven项目的打包方式。
5、classifier:该元素用了帮助定义构建输出的一些附属构件
上述5各元素中,groupId,artifactId,version是必须的,packaging可选的,默认jar,打包命令:mvn clean package。

  • 依赖
        <dependencies>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
                <type>……</type>
                <scope>……</scopt>
                <optional>……</optional>
                <exclusions>
                    <exclusion>
                        <groupId>……</groupId>
                        <artifactId>……</artifactId>
                        <version>……</version>
                    </exclusion>
                </exclusions>
    </dependency>
………………
<project>

1、groupId、artifactId、version:依赖的基本座标,对于一个依赖来说,基本座标是最重要的。
2、type:依赖的类型,对应于项目座标定义的packaging,默认为jar
3、scope:依赖的范围,包括
- compile:编译依赖范围,如果没有指定,默认使用该依赖范围,对编译,测试,运行都有效。
- test:测试依赖范围,此依赖范围,只对测试有效在编译主代码或者运行项目时无效
- Provided:已提供依赖范围,此依赖范围对于编译和测试有效,对于运行无效
- Runtime:运行时依赖范围
- System:系统依赖范围,和provided完全一致。使用systemPath元素显示地指定依赖文件的路径

4、optional:标记依赖是否可选,如果为true,只对当前项目产生影响,不会传递性依赖。
5、exclusions:用来排除传递性依赖
- 传递性依赖,比如A依赖B,B依赖C,A、B、C都是默认依赖范围,则A依赖C。依赖原则:第一:路径近者优先,第二:第一声明者优先。

二、maven仓库

分为本地仓库和远程仓库,当maven根据座标寻找构件的时候,首先查看本地仓库,如果本地仓库存在此构件,直接使用,如果本地不存在或者需要查看是否有更新的构件版本,maven就会去远程仓库查找,发现构件之后,下载到本地仓库在使用。

  • 中央仓库是maven核心自带的远程仓库,包含绝大部分开源的构件
  • 私服是架设在局域网内的私有的仓库服务器,用其代理外部的远程仓库,节省时间和带宽,并且可以部署自己的私有项目供其他项目使用,
  • 本地仓库,默认的路径名为.m2/repository/的仓库目录,windows下默认C:\Users\Administrator\.m2\repository\,linux下目录地址为/home/xxxx/.m2/repository/。可以通过设置修改本地仓库地址:
    <!-- 配置本地的仓库地址 -->
  <localRepository>E:\\mavenRepository</localRepository>
这样仓库地址就被设置成E:\\mavenRepository
不要直接修改根目录下的settings.xml,复制一份进行修改。
如果自己的一个maven项目被其他项目引用,通过mvn clean install将项目安装到本地maven仓库就可以供其他项目引用。
  • 远程仓库,安装好maven后,如果不执行任何maven命令,本地仓库目录是不存在的,用户执行第一条maven命令后,maven才会创建本地仓库,然后根据配置和需要,从远程仓库下载构件到本地仓库

  • 中央仓库,由于开始本地仓库是空的,maven必须知道至少一个可用的远程仓库,才能执行在maven命令的时候下载到需要的构件,中央仓库就是一个默认的远程仓库,maven安装自带的远程仓库配置

      <repository> 
          <id>nexus</id> 
          <name>local private nexus</name> 
          <url>http://repo1.maven.org/maven2/</url>
          <releases>  
               <enabled>true</enabled>  
          </releases>  
          <snapshots>  
               <enabled>true</enabled>  
               <updatePolicy>always</updatePolicy>
          </snapshots>         
      </repository>    
</repositories>
  • 私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的maven用户使用,当maven需要下载构件的时候,它从私服请求,如果私服不存在构件,则从外部远程仓库下载,缓存在私服上之后,再为maven下载请求提供服务。此外,一些无法从外部仓库下载到的构件也能从本地上传到私服上供其他人使用。使用私服的好处:
    1、 节省自己的外网带宽
    2、 加速maven构建
    3、 部署第三方构建
    4、 提高稳定性,增强控制
    5、 降低中央仓库的负荷

  • 远程仓库的配置
    很多情况下中央仓库不能满足项目需求,需要配置另外一个远程仓库。如Jboss仓库:

        <profile>
            <id>jboss</id>
             <repositories>
                <repository>
                 <id>jboss</id>
                 <name>jboss_maven2</name>
                 <url>https://repository.jboss.org/nexus/content/groups/public/</url>
<snapshots>
                    <enabled>true</enabled>
                </snapshots>
                <releases>
                    <enabled>true</enabled>
               </releases>
               <layout>default</layout>
             </repository>
             </repositories>
        </profile>
在repository元素下可以声明一个或多个远程仓库,这里声明了一个id为jboss的仓库,多个仓库,id必须唯一,需要注意的是maven自带的仓库id为central。如果其他仓库声明id也为central,将会覆盖maven自带的仓库,url指向仓库地址,一般基于http协议。这里的配置中releases和snapshots元素比较重要,他们用来控制maven对于发布版(正式版)构件和快照版(测试版)的下载,releases的enabled为true,支持发布版下载,snapshots的enabled为false,不支持快照版下载。Releases和snapshots还有另外两个子元素updatePolicy和checksumPolicy,updatePolicy表示配置maven从远程仓库检查更新的频率,默认为daily,表示每天检查一次,还有naver:从不检查,always:每次构建都更新,(interval:x)- 每隔x分钟检查一次。checksumPolicy配置maven检查校验和文件的策略,当构件被部署到maven仓库时,会同时部署对应的校验和文件。
  • 远程仓库的认证
    大部分远程仓库无需认证就可以访问,但有时候考虑到安全问题,我们需要提供认证信息才能访问一些远程仓库,如组织内部的私服。配置信息和认证信息配置不同,仓库信息可以直接配置到pom.xml中,但是认证信息必须配置在setting.xml中,因为pom.xml往往会被提交带代码仓库供所有成员访问,而setting.xml只放到本地,所以更安全。配置如下:
      <server>  
          <id>web</id>  
          <username>admin</username>  
          <password>1234</password>  
      </server>
      <server>  
          <id>snapshots</id>  
          <username>admin</username>  
          <password>1234</password>  
      </server>
  </servers>

这里配置了两个仓库的认证信息,一个id为webs,一个id为snapshots,账号密码一样,分别为admin,1234。上述配置中,最重要的是id,一定要与pom.xml中repository元素的id完全一致。通过id进行信息绑定。

部署远程仓库
部署远程仓库,主要是将第三方或者组织内部的构件放到私服上面供其他成员使用,需要编辑项目的pom.xml文件。配置distributionManagement元素。如下:

<distributionManagement>
        <repository>
            <id>web</id>
            <name>web Repository</name>
            <url>http:// 192.168.90.111:5002/repository/web-releases</url>
        </repository>
        <snapshotRepository>
            <id>snapshots</id>
            <name>Snapshot Repository</name>
            <url>http://192.168.90.111:5002/repository/snapshots</url>
        </snapshotRepository>
    </distributionManagement>
这里的id对应上面的认证,当需要部署构件时,需要认证信息。distributionManagement包含两个子元素,repository和snapshotRepository,分别表示发布版构件仓库和快照版构建仓库。无论下载构件还是部署构件,认证信息是一样的,配置好之后,执行mvn clean deploy就可以将项目构建输出的构件部署到远程仓库。
  • 仓库镜像
    如果可以从仓库x获取所有仓库y的内容,就可以说x是y的一个镜像。由于地理等一些原因,镜像往往可以提供比中央仓库更快的速度,配置镜像如下:
<mirrors>
      <!-- 阿里云 -->
     <mirror>
        <id>CN</id>
        <name>aliyun Central</name> 
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>

  </mirrors>
  ```
这里配置了阿里云的一个镜像,这里mirrorOf元素为central,表示是中央仓库的镜像。任何对中央仓库的请求都会转至该镜像,其他三个元素,与仓库配置无异,同时如果需要认证,也可以配置认证信息,基于id,与仓库一致。
镜像可以配合私服使用,私服可以代理任何的公共仓库,因此使用私服,相当于使用了所有仓库,可以将配置集中到私服,从而简化maven本身的配置,这是所有构件都可以从私服的到,私服就是所有仓库的镜像,配置如下:

<!-- 3.配置镜像,使得maven的构件下载转到私服中-->
<mirror>
      <id>mirrorid</id>
      <mirrorOf>*</mirrorOf>
      <name>topinfomirrorid</name>
    <url>http://192.168.40.39:8081/nexus/content/groups/public/</url>
     <mirrorOf>*</mirrorOf>
</mirror> 

这里mirrorOf为*,标识对所有远程仓库的请求,都会转至http://192.168.40.39:8081/nexus/content/groups/public/,如果需要认证,配置一个id为mirrorid的即可。
<mirrorOf>*</mirrorOf>:匹配所有远程仓库
<mirrorOf>external:*</mirrorOf>:匹配所有远程仓库,除了localhost,file://协议的,即匹配所有不在本机上的远程仓库
<mirrorOf>rel1,rel2</mirrorOf>:匹配rel1,rel2两个仓库
<mirrorOf>*,!rel1</mirrorOf>:匹配所有仓库,排除rel1.
由于镜像仓库屏蔽了所有被镜像仓库,当镜像仓库挂掉的时候,将无法下载构件。

三、生命周期

三套独立的生命周期,clean,default,site。Clean生命周期的目的是清理项目,default生命周期的目的是构建项目,sit声明周期的目的是建立项目站点。每个生命周期都包含一定的阶段,这些阶段都是有序的,并且后面的阶段依赖前面于前面的阶段

  • Clean生命周期:
    clean生命周期的目的是情理项目,包含三个阶段:
    1、 pre-clean执行一次清理前需要完成的工作
    2、 clean清理上一次构建生成的文件
    3、 post-clean执行一些清理后需要完成的工作

  • default生命周期:、
    default生命周期定义了真正构建是所需要执行的所有步骤,它是所有生命周期中最核心的部分。其包含的阶段如下:
    1、 validate
    2、 initialize
    3、 generate-sources
    4、 process-sources处理项目主资源文件。一般来说是对src/main/resources目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中
    5、 generate-resources
    6、 process-resources
    7、 compile编译项目的主源码,一般来说,是编译src/main/java目录下的java文件至项目输出的主classpath目录中
    8、 process-classes
    9、 generate-test-sources
    …………
    10、 package接受编译好的代码,打包成可发布的格式,如JAR
    11、 install将包安装到Maven本地仓库,供本地其他maven项目使用
    12、 deploy将最终的包复制到远程仓库,供其他开发人员和maven项目使用

  • site生命周期
    site生命周期的目的是建立和发布项目站点
    1、 pre-site执行一些在生成项目站点之前需要完成的工作
    2、 site生成项目站点文档
    3、 post-site执行一些在生成项目站点之后需要完成的工作
    4、 site-deploy将生成的项目站点发布到服务器上

  • 命令行与生命周期
    mvncleancleancleancleanprecleanclean mvn clean install:该命令调用clean生命周期的clean阶段和default生命周期的install阶段。
    $mvn clean deploy site-deploy:该命令调用clean生命周期的clean阶段,default生命周期的deploy阶段以及site生命周期的site-deploy阶段。

  • 插件绑定
    Maven生命周期与插件项目绑定,用以完成实际的构建任务。如maven-compile-plugin插件的compile目标绑定default生命周期compile这一阶段,可以完成项目编译这一目的。

  • 内置绑定:maven在核心为一些主要的生命周期阶段绑定了很多插件目标,当用户通过命令行调用生命周期阶段的时候,对应的插件目标就会执行相应的任务。如clean生命周期仅有pre-clean,clean和post-clean三个阶段,其中的clean与maven-clean-plugin:clean绑定,maven-clean-plugin仅有clean这一个目标,作用就是删除项目的输出目录。当我们执行maven命令的时候,控制台会打印绑定关系信息。如执行mvn clean install会看到调用了maven-clean-plugin,maven-resources-plugin,maven-compiler-plugin等。

  • 自定义绑定插件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章