zoukankan      html  css  js  c++  java
  • 《maven in action》部分知识点总结

    maven in action 的部分知识点总结

    今天又将《maven in action》这本书看了一遍,总结了一下,大概需要的知识点

    (一)解耦

      使用maven,在没有任何实际的Java代码,我们就可以定义一个maven项目的pom,这个就是maven的一大优点,能让项目对象模型最大程度的和实际的代码相互独立,这个就叫做解耦,或者正交性。

      当项目需要升级版本的时候,只需要修改pom,而不需要更改Java代码,在pom稳定之后,日常的Java代码开发公国基本不涉及pom的修改。

    (二)依赖范围

      在pom.xml的配置中,表示的是依赖范围
    例如在pom.xml中的junit的坐标如下

    <deprdency>
     <groupId>junit</groupId>
     <artifactId>junit</artificatId>
     <version>4.7</version>
     <scope>test</scope>
    </dependency>
    

    scope为依赖范围,在此处依赖范围是test,代表改以来只对测试有效。

    换句话说,在测试代码中使用import Junit没有问题,但是在主代码中使用import Junit,则会造成编译错误,如果不声明依赖范围,那么默认值就是compile,表示改以来对主代码和测试代码都有效。

    (三)maven的compile插件支持的Java版本

      由于历史的原因,maven的核心插件之一---compiler插件默认只支持变异Java1.3,因此需要配置该插件使其支持Java的别的版本。
    代码如下:

    <project>
     ...
    	<build>
    	   <plugins>
    		<plugin>
    			<groupId>org.apache.maven.plugins</groupId>
    			<artifactId>maven-compiler-plugin</artifactId>
    			<configuration>
    				<source>1.5</source>
    				<target>1.5</target>
    			</configuration>
    	    </plugin>
    	   </plugins>
    	</build>
    </project>
    

    这样配置后,该compiler插件支持Java1.5版本

    聚合

    为了能够使用一条命令就能构建 account-email和 account-persist两个模块,我们需要建立一个额外的名为 account-aggregator的模块,然后通过该模块构建整个项目的所有模块。 account-aggregator本身也是个 Maven项目,它的 POM如下

    <project>  
        <modelVersion>4.0.0</modelVersion>  
        <groupId>com.juvenxu.mvnbook.account</groupId>  
        <artifactId>account-aggregator</artifactId>  
        <version>1.0.0-SNAPSHOT</version>  
        <packaging> pom </packaging>  
        <name>Account Aggregator</name>  
         <modules>  
            <module>account-email</module>  
            <module>account-persist</module>  
         </modules>  
    </project>  
    

    注意:packaging的类型为pom ,module的值是一个以当前POM为主目录的相对路径。

    继承

    可声明父POM供子POM继承

    父模块POM如下:

    <project>  
    	<modelVersion>4.0.0</modelVersion>  
    	<groupId>com.juvenxu.mvnbook.account</groupId>  
    	<artifactId> account-parent </artifactId>  
    	<version>1.0.0-SNAPSHOT</version>  
    	<packaging>pom</packaging>  
    	<name>Account Parent</name>  
    </project>
    

    子模块声明继承如下

        <project>  
       	 <modelVersion>4.0.0</modelVersion>  
          
       	 < parent >  
         	   <groupId>com.juvenxu.mvnbook.account</groupId>  
         	   <artifactId> account-parent </artifactId>  
           	 <version>1.0.0-SNAPSHOT</version>  
          	  < relativePath >../account-parent/pom.xml</ relativePath>  
       	 </ parent >  
          
       	 <artifactId> account-email </artifactId>  
       	 <name>Account Email</name>  
      ...  
    	</project>
    

    最后,同样还需要把 account-parent加入到聚合模块account-aggregator中。聚合的 POM如下:

        <project>  
       	 <modelVersion>4.0.0</modelVersion>  
       	 <groupId>com.juvenxu.mvnbook.account</groupId>  
       	 <artifactId>account-aggregator</artifactId>  
        	<version>1.0.0-SNAPSHOT</version>  
        	<packaging> pom </packaging>  
       	 <name>Account Aggregator</name>  
       	 <modules>  
         	   <module>account-email</module>  
        	    <module>account-persist</module>  
          	  <module> account-parent</module>  
       	 </modules>  
     </project>  
    

    注意:

    1、子模块没有声明groupId和version, 这两个属性继承至父模块。但如果子模块有不同与父模块的 groupId、version ,也可指定;

    2、不应该继承artifactId,如果groupId ,version,artifactId 完全继承的话会造成坐标冲突;另外即使使用不同的 groupId或version,同样的 artifactId也容易产生混淆。
    3、使用继承后 parent也必须像自模块一样加入到聚合模块中。也就是在在聚合模块的 pom中加入account-parent

    (四)聚合与继承的关系

    区别 :
    1.对于聚合模块来说,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在。
    2.对于继承关系的父 POM来说,它不知道有哪些子模块继承与它,但那些子模块都必须知道自己的父 POM是什么。

    共同点 :
    1.聚合 POM与继承关系中的父POM的 packaging都是pom
    2.聚合模块与继承关系中的父模块除了 POM之外都没有实际的内容。

    继承与聚合的不同

    (五)maven可继承pom元素

        groupId :项目组 ID ,项目坐标的核心元素;  
    	version :项目版本,项目坐标的核心元素;  
    	description :项目的描述信息;  
    	organization :项目的组织信息;  
    	inceptionYear :项目的创始年份;  
    	url :项目的 url 地址  
    	develoers :项目的开发者信息;  
    	contributors :项目的贡献者信息;  
    	distributionManagerment :项目的部署信息;  
    	issueManagement :缺陷跟踪系统信息;  
    	ciManagement :项目的持续继承信息;  
    	scm :项目的版本控制信息;  
    	mailingListserv :项目的邮件列表信息;  
    	properties :自定义的 Maven 属性;  
    	dependencies :项目的依赖配置;  
    	dependencyManagement :醒目的依赖管理配置;  
    	repositories :项目的仓库配置;  
    	build :包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;  
    	reporting :包括项目的报告输出目录配置、报告插件配置等。  
    

    (六)依赖管理---dependencyManagement

    看上面的maven可继承pom元素中有dependencies元素,说明依赖会被继承的。

    想到一般多个子模块会痛是依赖springframework中的架包,那么可以将这些依赖加入到父模块中,这样子模块就可以一处相应的依赖,简化配置。

    但是这个有一个问题,就是不能确定将来添加的子模块就一定需要这几个依赖,加入将来又要添加一个子模块,但是需要别的架包,那么根本就不需要依赖springframework的架包

    可以使用dependencyManagement来让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性。

    父模块代码如下:

        <project xmlnsxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
        <modelVersion>4.0.0</modelVersion>  
        <groupId>com.juvenxu.mvnbook.account</groupId>  
        <artifactId>account-parent</artifactId>  
        <version>1.0.0-SNAPSHOT</version>  
        <packaging>pom</packaging>  
        <name>Account Parent</name>  
        <properties>  
            <springframework.version>2.5.6<springframework.version>  
            <junit.version>4.7</junit.version>  
        </properties>  
        < dependencyManagement >  
            <dependencies>  
                <dependency>  
                    <groupId>org.springframework</groupId>  
                    <artifactId>spring-core</artifactId>  
                    <version>${springframework.version}</version>  
                </dependency>  
                <dependency>  
                    <groupId>org.springframework</groupId>  
                    <artifactId>spring-beans</artifactId>  
                    <version>${springframework.version}</version>  
                </dependency>  
                <dependency>  
                    <groupId>org.springframework</groupId>  
                    <artifactId>spring-context</artifactId>  
                    <version>${springframework.version}</version>  
                </dependency>  
                <dependency>  
                    <groupId>org.springframework</groupId>  
                    <artifactId>spring-context-support</artifactId>  
                    <version>${springframework.version}</version>  
                </dependency>  
                <dependency>  
                    <groupId>junit</groupId>  
                    <artifactId>junit</artifactId>  
                    <version>${junit.version}</version>  
                    <scope>test</scope>  
                </dependency>  
            </dependencies>  
        </ dependencyManagement >  
    </project>  
    

    注意这里的父模块的pom代码,这里将用到的架包的的版本已maven参数的形式提取了出来,不仅消除了一些重复,也使得各以来的版本处于更明显的位置

    <properties>  
            <springframework.version>2.5.6<springframework.version>  
            <junit.version>4.7</junit.version>  
    </properties>
    

    子模块pom代码如下

        <project xmlnsxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
        <modelVersion>4.0.0</modelVersion>  
          
        < parent >  
            <groupId>com.juvenxu.mvnbook.account</groupId>  
            <artifactId> account-parent </artifactId>  
            <version>1.0.0-SNAPSHOT</version>  
        </ parent >  
          
        <artifactId>account-email</artifactId>  
        <name>Account Email</name>  
      
        <properties>  
            <javax.mail.version>1.4.1</javax.mail.version>  
            <greenmail.version>1.3.1b</greenmail.version>  
        </properties>  
      
        <dependencies>  
            <dependency>  
                <groupId>org.springframework</groupId>  
                <artifactId>spring-core</artifactId>                               
            </dependency>  
            <dependency>  
                <groupId>org.springframework</groupId>  
                <artifactId>spring-beans</artifactId>                                            
            </dependency>  
            <dependency>  
                <groupId>org.springframework</groupId>  
                <artifactId>spring-context</artifactId>                                         
            </dependency>  
            <dependency>  
                <groupId>org.springframework</groupId>  
                <artifactId>spring-context-support</artifactId>                                         
            </dependency>  
            <dependency>  
                <groupId>junit</groupId>  
                <artifactId>junit</artifactId>  
            </dependency>  
            <dependency>  
                <groupId>javax.mail</groupId>  
                <artifactId>mail</artifactId>  
                <version>${javax.mail.version}</version>  
            </dependency>                     
            <dependency>  
                <groupId>com.icegreen</groupId>  
                <artifactId>greenmail</artifactId>  
                <version>${greenmail.version}</version>  
                <scope>test</scope>  
            </dependency>  
        </dependencies>  
      
        <build>  
        </build>  
      
    </project>  
    

    注意子模块的写法,需要只有自己这个模块需要的架包,就在相应的架包依赖中写version,否则不需要写,共有的架包的依赖已经在父模板中已经写好,只需要继承父模板即可,兹莫办只需要配置相应的groupId和actifactId就可以获得相应的以来信息,从而引入正确的依赖;

    使用管理依赖的好处

    1.代码量减少,不用多次重复声明version等元素

    2.version在父模块中管理,父变则子变,便于修改,也便于版本的统一,不会发生不同的子模板使用的依赖的版本不一致的情况,降低冲突的几率。

    3.dependencyManagement一旦定义,可以复用

  • 相关阅读:
    GDB+QEMU调试内核模块(实践篇)
    排序算法的python实现
    Linux命令行相关
    操作系统与网络
    计算机组成原理
    有了自己的技术博客
    if 和 if else
    十效率换算成十六进制
    <<左移 >>右移 >>>无符号右移 &与运算 |或运算 ^异或运算 ~反码
    // &与 // |或 // ^异或 // !非 // &&短路 // ||短路
  • 原文地址:https://www.cnblogs.com/dushan/p/5057565.html
Copyright © 2011-2022 走看看