• maven POM —— maven权威指南学习笔记(五)


    1. 简介

    Archetype插件通过 pom.xml 文件创建了一个项目。这就是项目对象模型 (POM),一个项目的声明性描述。

    当Maven运行一个目标的时候,每个目标都会访问定 义在项目POM里的信息。

    这个POM文件在maven1中是project.xml,在maven2时改为pom.xml。

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="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/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>MavenLearn</groupId>
        <artifactId>simple</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </project>

    上面是一个简单的pom.xml文件的例子,可以看到,在上面这个文件中主要定义了,项目的基本信息 和 项目的依赖信息(dependencies)。

    项目的基本信息中最重要的就是: groupId,artifactId,version,这三个关键信息组成了一个项目的坐标(Coordinate),它可以唯一的标示一个项目,也是项目依赖的根据。

    • groupId:指定 团体,公司,小组,组织,项目,或者其它团体。团体标识的约定是,它以创 建这个项目的组织名称的逆向域名(reverse domain name)开头。例如,来自Sonatype 的项目有一个以com.sonatype开头的groupId,而Apache Software的项目有以 org.apache开头的groupId。
    • artifactId:在groupId下的表示一个单独项目的唯一标识符。
    • version:指定一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个 特定的版本。例如,对于在开发中的项目用“SNAPSHOT”标记。

    以上三个标记 加上 modelVersion(设置为4.0.0) 都是pom.xml中必需的。

    POM文件中除了可以指定上面提到的项目基本信息,dependencies,还可以定义插件, profiles,以及项目描述(description),研发人员(developer),邮件列表(mailing list)等。

    2. Maven变量

    我们在定义pom.xml 的时候,尤其是定义 dependencies时,通常会引入同一个版本的好多文件,比如spring 框架下,某个版本的spring-context,spring-test,spring-core,spring-beans,spring-webmvc 等等,即便它们下面有些是有依赖关系的,可以由maven帮我们做了,但是还有好多都是要自己写的,相当麻烦,如果这个你还可以接受,毕竟只定义一次嘛,那如果spring在未来哪天出了一个新特性,你特别想用,要升级一下,那又得重新改一遍,没准还改错了呢。这个时候就需要用到maven的变量了。这个时候就需要用到maven的变量了。

    maven变量分为自定变量内置变量

    2.1 自定义变量

    在pom文件中我们可以这样定义变量,

    <properties>
        <spring.group>org.springframework</spring.group>
        <spring.version>3.1.1.RELEASE</spring.version>
    </properties>

    在使用的时候,通过如下方法引用

    <dependency>
        <groupId>${spring.group}</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

    需要注意的是,在“<properties>”中除了可以自己构建需要的变量,也可以指定项目内置变量的值,例如,设置源码编码、生成报告编码和surefire插件的jvm运行参数为utf-8:

    <properties> 
    
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
    
            <argLine>-Dfile.encoding=UTF-8</argLine> 
    
    </properties>

     

    2.2 内置变量

    • ${basedir} 项目根目录
    • ${project.build.directory} 构建目录,缺省为target
    • ${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
    • ${project.build.finalName} 产出物名称,缺省为${project.artifactId}-${project.version}
    • ${project.packaging} 打包类型,缺省为jar
    • ${project.xxx} 当前pom文件的任意节点的内容

     

    3. 继承(Inheritance)聚合(Aggregation)

    接下来说一下pom的继承(Inheritance)聚合(Aggregation)

    继承是用在多个子项目,相同的配置的部分,可以抽离出来形成一个父pom,子项目都继承它。这样好处是,减少配置,配置的地方少了,出错的可能就减小了;抽取出了公共的配置,便于维护。

    聚合是把多个子项目合并到一起,可以用一个命令就完成整个项目的集成。举个例子,一个系统有三个子模块,由三个团队分别负责开发,都开发完之后,需要发布系统,聚合之后就可以一个命令搞定,而不是各个子项目分别打包,再集成为一个,各种问题。。。

    3.1 pom继承(Inheritance)

    继承的内容包括:dependencies、研发者信息、插件列表(包含reports)、插件的执行设置(plugin executions with matching ids)、插件配置、资源配置(resource)。

    一个列子:

    com.mycompany.app:my-app:1,其配置如下:

    <project>
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-module</artifactId>
      <version>1</version>
      <packaging>pom</packaging> 
    </project>

    它有一个子模块,my-module,目录结构如下:

    image

    如果让my-module继承my-app,那其pom可以如下配置(前提是my-app已经install到了local repository,或者my-app的pom文件在my-module pom文件的上一级目录):

    <project>
    <parent>
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-app</artifactId>
      <version>1</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-module</artifactId>
    <version>1</version>
    </project>

    如果不是上面的目录结构,又没有install到本地仓库的话,怎么破,比如这种结构:

    image.

    额。。直接用<relativePath>标签指定父级pom的路径就好了,

    <project>
    <parent>
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-app</artifactId>
      <version>1</version>
      <relativePath>../parent/pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>my-module</artifactId>
    </project>

    3.2 pom聚合(Aggregation)

    其实聚合的构建方法和继承的是很相似的,这里列举一个例子,假设目录如下:

    image

    parent是用于聚合的,my-module是子项目,

    parent的pom如下:

    <project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>1</version>
    <packaging>pom</packaging>
    
    <modules>
    <module>../my-module</module>
    </modules>
    </project>

    注意两点:

    • 必须指定<packaging>pom</packaging>
    • 在module中,可以通过相对路径指定要聚合的项目的pom路径,例子中只有一个子项目,如果有多个,都在modules中指定就可以了

    被聚合的项目my-module的pom如下:

    <project>
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.mycompany.app</groupId>
     <artifactId>my-module</artifactId>
     <version>1</version>
    </project>

    3.3 继承与聚合小结

    总结一下继承和聚合

    区别

    1.对于聚合模块来说,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在。

    2.对于继承关系的父 POM来说,它不知道有哪些子模块继承与它,但那些子模块都必须知道自己的父 POM是什么。

    共同点

    1.聚合 POM与继承关系中的父POM的 packaging都是pom

    2.聚合模块与继承关系中的父模块除了 POM之外都没有实际的内容。

    3.4 继承(Inheritance)+ 聚合(Aggregation)

    我们可以单独使用继承或者聚合的特性,也可以结合起来使用,

    下面来一个集合继承与聚合的实例,

    首先用idea建立四个项目,目录如图:

    clipboard

    最终的目的是:pomLearn目录用于聚合,module1,module2继承module_parent

    现在先配置好基础项目的关系,四个配置文件如下:

    pomLearn——聚合 aggregation

    clipboard[1]

    注意:

    • packaging为pom
    • 在聚合的时候,父pom目录也需要引入"<module>"中,目录的路径是相对路劲。

    module_parent

    clipboard[2]

    注意:

    • packaging为pom
    • 子项目继承module_parent后,即可不引入junit了

    module1

    clipboard[3]

    注意:

    • 子项目的groupId可以与父项目不同;相同时可以省略

    module2

    clipboard[4]

    ok,运行一下mvn clean,出现以下结果,配置成功:

    D:Javajdk1.8.0_65injava -Dmaven.multiModuleProjectDirectory=$M2_HOME -Dmaven.home=D:Codingapache-maven-3.3.3 -Dclassworlds.conf=D:Codingapache-maven-3.3.3inm2.conf -Didea.launcher.port=7539 "-Didea.launcher.bin.path=D:CodingJetBrainsIntelliJ IDEA 14.0in" -Dfile.encoding=UTF-8 -classpath "D:Codingapache-maven-3.3.3ootplexus-classworlds-2.5.2.jar;D:CodingJetBrainsIntelliJ IDEA 14.0libidea_rt.jar" com.intellij.rt.execution.application.AppMain org.codehaus.classworlds.Launcher -Didea.version=14.0 clean
    [INFO] Scanning for projects...
    [INFO] ------------------------------------------------------------------------
    [INFO] Reactor Build Order:
    [INFO]
    [INFO] module_parent
    [INFO] module1
    [INFO] module2
    [INFO] pomLearn
    [INFO]                                                                        
    [INFO] ------------------------------------------------------------------------
    [INFO] Building module_parent 1.0-SNAPSHOT
    [INFO] ------------------------------------------------------------------------
    [INFO]
    [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ module_parent ---
    [INFO]                                                                        
    [INFO] ------------------------------------------------------------------------
    [INFO] Building module1 1.0-SNAPSHOT
    [INFO] ------------------------------------------------------------------------
    [INFO]
    [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ module1 ---
    [INFO]                                                                        
    [INFO] ------------------------------------------------------------------------
    [INFO] Building module2 1.0-SNAPSHOT
    [INFO] ------------------------------------------------------------------------
    [INFO]
    [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ module2 ---
    [INFO]                                                                        
    [INFO] ------------------------------------------------------------------------
    [INFO] Building pomLearn 1.0-SNAPSHOT
    [INFO] ------------------------------------------------------------------------
    [INFO]
    [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ pomLearn ---
    [INFO] ------------------------------------------------------------------------
    [INFO] Reactor Summary:
    [INFO]
    [INFO] module_parent ...................................... SUCCESS [  0.135 s]
    [INFO] module1 ............................................ SUCCESS [  0.003 s]
    [INFO] module2 ............................................ SUCCESS [  0.002 s]
    [INFO] pomLearn ........................................... SUCCESS [  0.001 s]
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 0.230 s
    [INFO] Finished at: 2016-01-19T23:50:18+08:00
    [INFO] Final Memory: 8M/309M
    [INFO] ------------------------------------------------------------------------

    Process finished with exit code 0

    3.5 Super POM

    在没有特别指定的情况下,我们使用的pom文件都是继承自maven的Super POM,文章最后列出的就是Maven 2.1.x 的Super POM,也可以参看maven document 的 Introduction to the POM

    <project>
        <modelVersion>4.0.0</modelVersion>
        <name>Maven Default Project</name>
    
        <repositories>
            <repository>
                <id>central</id>
                <name>Maven Repository Switchboard</name>
                <layout>default</layout>
                <url>http://repo1.maven.org/maven2</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
    
        <pluginRepositories>
            <pluginRepository>
                <id>central</id>
                <name>Maven Plugin Repository</name>
                <url>http://repo1.maven.org/maven2</url>
                <layout>default</layout>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
                <releases>
                    <updatePolicy>never</updatePolicy>
                </releases>
            </pluginRepository>
        </pluginRepositories>
    
        <build>
            <directory>${project.basedir}/target</directory>
            <outputDirectory>${project.build.directory}/classes</outputDirectory>
            <finalName>${project.artifactId}-${project.version}</finalName>
            <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
            <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
            <!-- TODO: MNG-3731 maven-plugin-tools-api < 2.4.4 expect this to be relative... -->
            <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
            <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
            <resources>
                <resource>
                    <directory>${project.basedir}/src/main/resources</directory>
                </resource>
            </resources>
            <testResources>
                <testResource>
                    <directory>${project.basedir}/src/test/resources</directory>
                </testResource>
            </testResources>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <artifactId>maven-antrun-plugin</artifactId>
                        <version>1.3</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-assembly-plugin</artifactId>
                        <version>2.2-beta-2</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-clean-plugin</artifactId>
                        <version>2.2</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>2.0.2</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-dependency-plugin</artifactId>
                        <version>2.0</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-deploy-plugin</artifactId>
                        <version>2.4</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-ear-plugin</artifactId>
                        <version>2.3.1</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-ejb-plugin</artifactId>
                        <version>2.1</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-install-plugin</artifactId>
                        <version>2.2</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-jar-plugin</artifactId>
                        <version>2.2</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-javadoc-plugin</artifactId>
                        <version>2.5</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-plugin-plugin</artifactId>
                        <version>2.4.3</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-rar-plugin</artifactId>
                        <version>2.2</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-release-plugin</artifactId>
                        <version>2.0-beta-8</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-resources-plugin</artifactId>
                        <version>2.3</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-site-plugin</artifactId>
                        <version>2.0-beta-7</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-source-plugin</artifactId>
                        <version>2.0.4</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <version>2.4.3</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-war-plugin</artifactId>
                        <version>2.1-alpha-2</version>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    
        <reporting>
            <outputDirectory>${project.build.directory}/site</outputDirectory>
        </reporting>
        <profiles>
            <profile>
                <id>release-profile</id>
    
                <activation>
                    <property>
                        <name>performRelease</name>
                        <value>true</value>
                    </property>
                </activation>
    
                <build>
                    <plugins>
                        <plugin>
                            <inherited>true</inherited>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-source-plugin</artifactId>
                            <executions>
                                <execution>
                                    <id>attach-sources</id>
                                    <goals>
                                        <goal>jar</goal>
                                    </goals>
                                </execution>
                            </executions>
                        </plugin>
                        <plugin>
                            <inherited>true</inherited>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-javadoc-plugin</artifactId>
                            <executions>
                                <execution>
                                    <id>attach-javadocs</id>
                                    <goals>
                                        <goal>jar</goal>
                                    </goals>
                                </execution>
                            </executions>
                        </plugin>
                        <plugin>
                            <inherited>true</inherited>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-deploy-plugin</artifactId>
                            <configuration>
                                <updateReleaseInfo>true</updateReleaseInfo>
                            </configuration>
                        </plugin>
                    </plugins>
                </build>
            </profile>
        </profiles>
    
    </project>
    View Code

    参考:

    Introduction to the POM,maven document,http://maven.apache.org/guides/introduction/introduction-to-the-pom.html

    聚合与继承,iqeq00,http://iqeq00.iteye.com/blog/2033617?utm_source=tuicool&utm_medium=referral

    Maven聚合与继承,chenzhou123520,http://chenzhou123520.iteye.com/blog/1582166

    一个多maven项目聚合的实例,kyfxbl,http://www.iteye.com/topic/1126788

    maven权威指南

  • 相关阅读:
    html5 返回当前地理位置的坐标点(经纬度)
    C#趣味程序---百鸡百钱
    Android开发:怎样隐藏自己的app应用
    Android Studio一些简单设置
    集群通信组件tribes之集群的消息接收通道
    Java基础实例
    如何用webbrowser获取ajax动态生成的网页的源码?
    phantomjs 下拉滚动条获取网页的全部源码
    Nodejs+定时截图+发送邮件
    关注网页的更新状况,了解最新的handsup 消息.
  • 原文地址:https://www.cnblogs.com/chrischennx/p/5119673.html
Copyright © 2020-2023  润新知