Maven学习笔记

阅读《Maven实战》许晓斌的一些笔记,便于自己和道友查阅

maven依赖

maven具有传递性依赖,比如 A 依赖 B 项目,B 项目依赖C项目,同时B项目可选依赖D项目,那么C就会成为A的范围依赖,而D不会成为A的范围依赖。A对于B是第一直接依赖,B对于C是第二直接依赖,A对与C是传递性依赖。

  • 依赖范围影响传递性依赖图表, 最左边一列表示第一直接依赖范围,最上面一行表示第二直接依赖范围:
compile test provided runtime
compile compile -- -- runtime
test test -- -- test
provided provided -- provided provided
runtime runtime -- -- runtime
  • 依赖调解,第一原则:路径最近优先,第二原则:第二声明者优先。
  • 可选依赖声明:

...
    
        mysql
        mysql-connector-java
        5.1.10
        true
    
...

  • 排除依赖,某些时候我们不需要某些传递性依赖,可以在在pom文件的部分增加 标签排除:

  ...
  
    
      sample.ProjectA
      Project-A
      1.0
      compile
      
          
          sample.ProjectB
          Project-B
        
      
    
  

  • 优化依赖
    使用mvn dependency:list或者mvn dependency:tree查看项目依赖详情
    使用 mvn dependency:analyze进行分析。

maven的聚合和继承

  • 聚合,
    一个项目分为多个模块,即多个maven项目,聚合可以时多个模块同时执行mvn命令等。

    ...
    com.example
    module-0
    pom  
    Parent Project
    
        module-1
        module-2
    
    ...

这里的每个module的值都是一个当前POM的相对目录,比如module-0的目录为/home/user/module-0,则module-1的目录应该为/home/user/module-0/module-1,
module-2的目录应该为/home/user/module-0/module-2, module的值为相对路径或者绝对路径,且是模块的目录名,而不是模块的artifactId值。建议目录名即为artifactId值。

  • 继承
    如果pom存在许多相同的配置,可以通过继承解决
    一个例子
    父pom


    4.0.0
    com.example
    parent-project
    1.0-SNAPSHOT
    pom  
    Parent Project

    
        UTF-8
        1.8
        1.8
        4.3.8.RELEASE
    

    
        
            junit
            junit
            4.12
        
    

    
        
            
                org.springframework
                spring-core
                ${spring.version}
            
        
    

    
        
            
                
                    org.apache.maven.plugins
                    maven-compiler-plugin
                    3.6.1
                    
                        ${project.build.sourceEncoding}
                        ${java.compiler.source}
                        ${java.compiler.target}
                    
                
            
        
    

子pom



    4.0.0

    
        parent-project
        com.example
        1.0-SNAPSHOT
        ../parent-project/pom.xml
    

    child-1
    Child Project 1

    
        
            org.springframework
            spring-core
        
    

    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
            
        
    

父pom的packaging类型必须为pom,父模块只是为了帮助消除配置的重复,所以它本身不包含除了pom之外的项目文件。

子pom继承的时候,parent下的子元素groupId, artifactId, version是必填的。元素relativePath表示父模块pom的相对路径。项目构建时,maven首先根据relativePath检查父pom,如果没有,则在本地仓库查找(mvn install 即安装了本地仓库)。relativePath的默认值是../pom.xml,也就是说,maven默认父pom在上一层目录下。

可继承的pom元素有如下groupId, version, description, organization, inceptionYear, url, developers, contributors, distributionManagement, issueManagement, ciManagement, scm, mailingLists, properties, dependencies, dependencyManagement, repositories, build, reporting

在子pom文件中,所有的依赖和插件只配置了groupId 和 artifactId,省去了version, scope等。这样能够通过父pom统一依赖版本,范围等。如果子模块不声明依赖的使用,即使依赖已经在父pom的dependencyManagement或者pluginManagement,也不会对子模块产生影响。而不在父pom的dependencyManagement或者pluginManagement中的依赖,则会被子模块继承。

  • 聚合和继承的关系
    聚合是为了快速构建项目,而继承是为了消除重复配置。
    同时一个pom既可以是聚合pom也可以是父pom。

  • 裁剪反应堆
    当需要构建整个项目或者选择构建单个模块,就需要实时的裁剪反应堆。例如
    -am 同时构建所列模块的依赖模块, 例如 mvn clean -am
    -amd同时构建依赖于所列模块的模块
    -pl构建指定模块,模块间用英文逗号分隔
    -rf 充只等的模块回复反应堆,

其他

  • mvn属性,资源过滤,maven profile
  • 使用nexus创建私服
  • 使用Hudson进行持续集成
  • 自己编写maven插件

推荐阅读
maven官方指南
可选的依赖和依赖排除
Maven 资源过滤相关
使用 Maven Profile 和 Filtering 打各种环境的包
profile介绍
使用Nexus创建私服
使用Hudson进行持续集成
Maven提高篇系列之(六)——编写自己的Plugin(本系列完)

你可能感兴趣的:(Maven学习笔记)