Maven

Maven POM

POM的全称是Project Obejet Model, 整个项目的核心配置和信息都包含在这份xml文件中,一个最基本的pom文件要求至少有下列三要素:groupId, artifactId, version, 因此一个最小的POM配置文件如下所示:

    
      4.0.0
      com.mycompany.app
      my-app
      1
    
  1. 超级POM
    • 作用:所有的POM全部继承自该POM, 意味着所有POM的默认配置也位于这里
      举例的配置如下:
      build directory: target
      source directory: src/main/java
      test source directory: src/test/java
      output directory: classes

    • 位置:位于 maven 安装目录的lib文件夹下的一个jar包中,使用Java反编译工具(如Java-Decompiler)即可查看,以本机为例,超级POM的位置如下:

      C:\Program Files (x86)\apache-maven-3.6.1\lib\maven-model-builder-3.6.1.jar
      
    • 内容:

      
      
      
      
      
      
      4.0.0
      
      
          
          central
          Central Repository
          https://repo.maven.apache.org/maven2
          default
          
              false
          
          
      
      
      
          
          central
          Central Repository
          https://repo.maven.apache.org/maven2
          default
          
              false
          
          
              never
          
          
      
      
      
          ${project.basedir}/target
          ${project.build.directory}/classes
          ${project.artifactId}-${project.version}
          ${project.build.directory}/test-classes
          ${project.basedir}/src/main/java
          ${project.basedir}/src/main/scripts
          ${project.basedir}/src/test/java
          
          
              ${project.basedir}/src/main/resources
          
          
          
          
              ${project.basedir}/src/test/resources
          
          
          
          
          
          
              
              maven-antrun-plugin
              1.3
              
              
              maven-assembly-plugin
              2.2-beta-5
              
              
              maven-dependency-plugin
              2.8
              
              
              maven-release-plugin
              2.5.3
              
          
          
      
      
      
          ${project.build.directory}/site
      
      
      
          
          
          release-profile
      
          
              
              performRelease
              true
              
          
      
          
              
              
                  true
                  maven-source-plugin
                  
                  
                      attach-sources
                      
                      jar-no-fork
                      
                  
                  
              
              
                  true
                  maven-javadoc-plugin
                  
                  
                      attach-javadocs
                      
                      jar
                      
                  
                  
              
              
                  true
                  maven-deploy-plugin
                  
                  true
                  
              
              
          
          
      
      
      
      
      

POM的继承

子 module 可以继承的元素如下

dependencies
developers and contributors
plugin lists (including reports)
plugin executions with matching ids
plugin configuration
resources

假设现有的项目结构如下:

.
 |-- my-module
 |   `-- pom.xml
 `-- pom.xml

两份 pom 的内容分别如下:



  4.0.0
 
  com.mycompany.app
  my-app
  1



  4.0.0
 
  com.mycompany.app
  my-module
  1

现在如果想让 my-module 继承 my-app 的元素,需要在 my-module/pom.xml 中添加 parent 节点,更改后的 my-module/pom.xml 配置如下

    
      4.0.0
      
        com.mycompany.app
        my-app
        1
        
        ../pom.xml
      
      
      my-module
    

模块化聚合

Maven 中的 POM 除了继承,还可以使用聚合来联系各个独立的 POM。我们知道继承是在子模块下定义 parent 节点,这样每个子模块是知道自己的父 POM 是谁,聚合则和继承相反,聚合在父 POM 中定义它所有的子模块,这样做的好处是,父 POM 知道他所有的子模块,这样对父 POM 执行一些命令时,其所有的子模块也会得到执行。
假设现有的项目结构如下:

.
 |-- my-module
 |   `-- pom.xml
 `-- pom.xml

两份 pom 的内容分别如下:



  4.0.0
 
  com.mycompany.app
  my-app
  1



  4.0.0
 
  com.mycompany.app
  my-module
  1

现在想让 my-app 和 my-moudle 以聚合的方式连接,只需修改 my-app 的 POM 文件如下:

    
    
      4.0.0
      com.mycompany.app
      my-app
      1
      
      pom
      
      
        
        my-module
      
    
  • 聚合和继承的区别
    继承:使得子模块继承父 POM 的一些属性和配置,可以继承的元素如下:
dependencies
developers and contributors
plugin lists (including reports)
plugin executions with matching ids
plugin configuration
resources

聚合:对父 POM 执行命令时,相同的命令会同时在所有的子模块中执行一遍,方便多模块的打包和测试。注意聚合并不会继承父 POM 中的任何属性和配置。
继承+聚合:子模块继承父 POM 中的属性和配置,同时在父 POM 中执行命令时,在子模块也会得到执行。(常用+推荐)

Maven Properties

为了减少重复性的工作,POM 支持变量,从而达到修改一处,处处生效的效果。在每一个 POM 中,Maven 已经构建了一些内置的变量供我们使用,如

  • ${project.groupId}
  • ${project.artifactId}
  • ${project.version}
  • ${project.basedir}
  • ${project.baseuri}
  • ${maven.build.timestamp}

我们自己也可以声明变量,声明方式如下:


  4.0.0
 
  com.mycompany.app
  my-app
  1


    1.4
    1.8
    UTF-8
    5.1.38
    UTF-8
    3.2.6.RELEASE
  

声明变量之后,在 POM 文件的任何地方都可以引用该变量了。引用的方式如下:

    
        commons-dbcp
        commons-dbcp
        ${dbcp-version}
    

变量也存在继承关系,子模块也会覆盖父 POM 中定义的变量。这和面向对象的思想是一样的。

Maven Profile

  1. profile的作用
    我们在开发的时候经常需要不同的运行环境,不同运行环境的配置可能不相同,如数据源,日志文件等,Maven中的profile给予我们开发人员基于不同环境灵活的切换不同配置的能力

  2. 在project中定义你的profile
    我们在如下的pom中定义了两个不同的profile,分别是 testproduction,根据不同的环境,Maven编译的时候会自动把这些变量编译到properties文件中

    
        
            test
            
                
                true
            
            
                /export/Logs/com.fanyank.app
                INFO
                
                jdbc:mysql://111.111.111.111:3358/app
                fanyank
                fanyank
            
        
    
        
            production
            
                /export/Logs/com.fanyank.app
                ERROR
                
                jdbc:mysql://222.222.222.222:3358/app
                fanyank
                fanyank
            
        
    
    
  3. 如何使profile生效呢?

    • 命令指定
      使用 -P 指定生效的profile为production
    mvn groupId:artifactId:goal -P production
    
    • pom中指定
        
            prod
            
                prod
            
            
            
                
                true
                
                
                
                1.5
                
                [1.5,)
    
                
                
                    Windows XP
                    Windows
                    x86
                    5.1.2600
                
    
                
                
                    env
                    test
                
    
                
                
                    target/generated-sources/axistools/wsdl2java/
                        com/companyname/group
                    
                
            
        
    
    • settings.xml
      针对全局声明的profile(${maven.home}/conf/settings.xml),使用 标签指定生效的profile
    
      ...
      
        profile-1
      
      ...
    
    
  4. 我可以使用profile定制化哪些内容?

    • external files
      external files包括全局setting.xml, 你的profile只能用来修改如下三个参数 , ,
      其中 用来存放你们公司的私服仓库地址,用来存放私服plugin地址,很少使用
    • profile in POMs
      定制任意数量的键值对,并在编译时期注入到properties中
    
    
    
    
    
    
    
    a subset of the  element, which consists of:
    
    
    
    
    

你可能感兴趣的:(Maven)