• 为什么要用maven 2


    本文是接着前面的一片继续记录maven的学习笔记:[url]http://jackycheng2007.iteye.com/blog/923791 
    [/url] 

    法宝2. POM 项目对象模型 - 继续 
    Project Inheritance - 项目继承 
    前面说到了项目在maven里被看成是object,既然如此,肯定有继承的功能。这个功能很有用,等于是让我们的项目profile也能被重用。试想,如果你有很多相似的项目,比如采用ssh开发的一系列项目,你的每个项目的pom里面肯定有不少重复的部分。有了继承,你就可以把这些公用的部分都抽取出来,然后每个子项目再继承,从而达到重用的目的。本来嘛,继承就是反应了is-a的关系,一个supper项目下面的子项目天生就和supper项目有is-a的关系吧。这样也不算滥用继承了,哈哈。 
    怎么继承呢? 

    接着上篇文章的最后一个例子,如果他下面有个子模块需要继承它的话: 

    Java代码  收藏代码
    1. <project>  
    2.   <parent>  
    3.     <groupId>com.mycompany.app</groupId>  
    4.     <artifactId>my-app</artifactId>  
    5.     <version>1</version>  
    6.   </parent>  
    7.   <modelVersion>4.0.0</modelVersion>  
    8.   <artifactId>my-module</artifactId>  
    9. </project>  


    这个子模块就继承了父模块的groupid和version等信息。等一下,这里有个问题。就凭 
    <groupId>com.mycompany.app</groupId>,子模块怎么找到supper的pom啊? 
    是的,如果supper项目已经安装在local的repository里面了或者supper的pom在约定的目录,也就是子模块的上一级目录(如下),就可以。 

    引用

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



    那么,如果不巧,这两条都不是呢?比如: 

    引用


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


    那我们还可以自己指定位置: 

    Java代码  收藏代码
    1. <project>  
    2.   <parent>  
    3.     <groupId>com.mycompany.app</groupId>  
    4.     <artifactId>my-app</artifactId>  
    5.     <version>1</version>  
    6.     <relativePath>.../parent/pom.xml</relativePath>  
    7.   </parent>  
    8.   <modelVersion>4.0.0</modelVersion>  
    9.   <artifactId>my-module</artifactId>  
    10. </project>  



    Project Aggregation - 项目集合 
    通过项目继承,我们再管理或者构建子项目的时候就能从用parent项目的pom。反过来呢?如果我们要构建一个完整的项目,是不是经常需要集合多个子项目来打包呢。Project Aggregation就是解决这个问题的。 
    怎么做呢?得满足两点: 

    引用

    父项目的pom里面的packaging的值设为 "pom" . 
    在父项目的pom里面自定子项目的目录 



    如果我们想把my-module集合到my-app里面,做如下的修改: 

    Java代码  收藏代码
    1. <project>  
    2.   <modelVersion>4.0.0</modelVersion>  
    3.   <groupId>com.mycompany.app</groupId>  
    4.   <artifactId>my-app</artifactId>  
    5.   <version>1</version>  
    6.   <packaging>pom</packaging>  
    7.   
    8.   <modules>  
    9.     <module>my-module</module>  
    10.   </modules>  
    11. </project>  


    上面,没有写路径,也是因为如果遵循maven的目录约定。如果不是那就得写: 

    Java代码  收藏代码
    1. <project>  
    2.   <modelVersion>4.0.0</modelVersion>  
    3.   <groupId>com.mycompany.app</groupId>  
    4.   <artifactId>my-app</artifactId>  
    5.   <version>1</version>  
    6.   <packaging>pom</packaging>  
    7.   
    8.   <modules>  
    9.     <module>../my-module</module>  
    10.   </modules>  
    11. </project>  


    可见,约定是一种很好的方式,可以节省代码,也容易形成共识。 
    Project Interpolation and Variables - 使用变量 
    有可能在pom里面你会在多处用到同一个字符串片段,比如路径。meven支持变量的声明和引用,这样你就可以防止hard code了。 
    怎么引用变量?看看下面: 

    Java代码  收藏代码
    1. <version>${project.version}</version>  


    $符号加上大括号,用点来分级访问。很方便。如果有继承关系,会采用子类的值。 
    有哪些可用的变量呢? 

    Project Model Variables 
    pom里面的任何单值元素都可以被当做变量来引用,比如: 

    引用

    ${project.groupId}, ${project.version}, ${project.build.sourceDirectory}



    Special Variables 
    ${basedir}, 当前项目所在目录 
    ${project.baseUri}, 当前项目所在目录URI. Since Maven 2.1.0 
    ${maven.build.timestamp}, 项目build的开始时间. Since Maven 2.1.0-M1 

    Properties 
    你也可以把pom里面定义的Properties当成变量来引用。 

    Java代码  收藏代码
    1. <project>  
    2.   ...  
    3.   <properties>  
    4.     <mavenVersion>2.1</mavenVersion>  
    5.   </properties>  
    6.   <dependencies>  
    7.     <dependency>  
    8.       <groupId>org.apache.maven</groupId>  
    9.       <artifactId>maven-artifact</artifactId>  
    10.       <version>${mavenVersion}</version>  
    11.     </dependency>  
    12.     <dependency>  
    13.       <groupId>org.apache.maven</groupId>  
    14.       <artifactId>maven-project</artifactId>  
    15.       <version>${mavenVersion}</version>  
    16.     </dependency>  
    17.   </dependencies>  
    18.   ...  
    19. </project>  


    通过Properties,你就可以自定义一些变量了,哈哈。

  • 相关阅读:
    asp.net中的窗体身份验证(不同的角色访问不同的目录)
    asp.net中的窗体身份验证(完整篇之六:登出后不能通过后退回来面来的页面)
    asp.net中的窗体身份验证(完整篇之一:创建asp.net的窗体身份验证方式)
    asp.net中的窗体身份验证(完整篇之四:获得用户数据)
    asp.net中的窗体身份验证(完整篇之五:退出登录)
    [iphone]UIImage,CGImage和CGImageRef有什么区别
    glVertexAttribPointer
    在OpenGL中使用着色器的步骤
    glViewport()函数和glOrtho()函数的理解
    OpenGL ES 三种类型修饰 uniform attribute varying
  • 原文地址:https://www.cnblogs.com/yqskj/p/3021398.html
Copyright © 2020-2023  润新知