maven总结-pom文件

maven总结-pom文件pom文件作用pom.xml主要描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和licenses,以及其他所有的项目相关因素,是项目级别的配置文件。配置说明基础配置一个典型的pom.xml文件配置如下:<project xmlns=&quot

大家好,欢迎来到IT知识分享网。

pom文件作用

pom.xml主要描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和licenses,以及其他所有的项目相关因素,是项目级别的配置文件。

配置说明

基础配置

一个典型的pom.xml文件配置如下:

<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">  
<!-- 模型版本。maven2.0必须是这样写,现在是maven2唯一支持的版本 -->  
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.winner.trade,maven会将该项目打成的jar包放本地路径:/com/winner/trade -->  
<groupId>com.winner.trade</groupId>
<!-- 本项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->  
    <artifactId>trade-core</artifactId>
    <!-- 本项目目前所处的版本号 -->  
    <version>1.0.0-SNAPSHOT</version>
    <!-- 打包的机制,如pom,jar, maven-plugin, ejb, war, ear, rar, par,默认为jar -->  
    <packaging>jar</packaging>
    <!-- 帮助定义构件输出的一些附属构件,附属构件与主构件对应,有时候需要加上classifier才能唯一的确定该构件 不能直接定义项目的classifer,因为附属构件不是项目直接默认生成的,而是由附加的插件帮助生成的 -->  
    <classifier>...</classifier>
    <!-- 定义本项目的依赖关系 -->  
    <dependencies>
        <!-- 每个dependency都对应这一个jar包 -->  
        <dependency>
            <!--一般情况下,maven是通过groupId、artifactId、version这三个元素值(俗称坐标)来检索该构件, 然后引入你的工程。如果别人想引用你现在开发的这个项目(前提是已开发完毕并发布到了远程仓库),-->   
            <!--就需要在他的pom文件中新建一个dependency节点,将本项目的groupId、artifactId、version写入, maven就会把你上传的jar包下载到他的本地 -->  
            <groupId>com.winner.trade</groupId>  
            <artifactId>trade-test</artifactId>  
            <version>1.0.0-SNAPSHOT</version> 
            <!-- maven认为,程序对外部的依赖会随着程序的所处阶段和应用场景而变化,所以maven中的依赖关系有作用域(scope)的限制。 -->  
            <!--scope包含如下的取值:compile(编译范围)、provided(已提供范围)、runtime(运行时范围)、test(测试范围)、system(系统范围) -->  
            <scope>test</scope> 
            <!-- 设置指依赖是否可选,默认为false,即子项目默认都继承:为true,则子项目必需显示的引入,与dependencyManagement里定义的依赖类似  -->  
            <optional>false</optional>
            <!-- 屏蔽依赖关系。 比如项目中使用的libA依赖某个库的1.0版,libB依赖某个库的2.0版,现在想统一使用2.0版,就应该屏蔽掉对1.0版的依赖 -->  
            <exclusions>  
                <exclusion>  
                    <groupId>org.slf4j</groupId>  
                    <artifactId>slf4j-api</artifactId>  
                </exclusion>  
            </exclusions>
        </dependency>
    </dependencies>  
  
    <!-- 为pom定义一些常量,在pom中的其它地方可以直接引用 使用方式 如下 :${file.encoding} -->  
    <properties>  
        <file.encoding>UTF-8</file.encoding>  
        <java.source.version>1.5</java.source.version>  
        <java.target.version>1.5</java.target.version>  
    </properties>  
  
    ...  
</project>  

一个典型的pom.xml文件配置如下:
 
一般来说,上面的几个配置项对任何项目都是必不可少的,定义了项目的基本属性。
这里有必要对一个不太常用的属性classifier做一下解释,因为有时候引用某个jar包,classifier不写的话会报错。
classifier元素用来帮助定义构件输出的一些附属构件。附属构件与主构件对应,比如主构件是 kimi-app-2.0.0.jar,该项目可能还会通过使用一些插件生成 如kimi-app-2.0.0-javadoc.jar (Java文档)、 kimi-app-2.0.0-sources.jar(Java源代码) 这样两个附属构件。这时候,javadoc、sources就是这两个附属构件的classifier,这样附属构件也就拥有了自己唯一的坐标。
classifier的用途在于:
1. maven download  javadoc / sources jar包的时候,需要借助classifier指明要下载那个附属构件
2. 引入依赖的时候,有时候仅凭groupId、artifactId、version无法唯一的确定某个构件,需要借助classifier来进一步明确目标。比如JSON-lib,有时候会同一个版本会提供多个jar包,在JDK1.5环境下是一套,在JDK1.3环境下是一套:
 

maven总结-pom文件

引用它的时候就要注明JDK版本,否则maven不知道你到底需要哪一套jar包:

<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
     <version>2.4</version>
    <classifier>jdk15</classifier>
</dependency>

声明规范

<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">
  <!--声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。-->
  <modelVersion>4.0.0</modelVersion>

parent

<parent>
		<groupId>org.springside</groupId>
		<artifactId>springside-parent</artifactId>
		<version>4.2.4-SNAPSHOT</version>
		<relativePath>../../modules/parent/</relativePath>
</parent>
<!--父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom。-->
<relativePath>../../modules/parent/</relativePath>

我们创建一个parent项目,打包类型为pom,parent项目中不存放任何代码,只是管理多个项目之间公共的依赖。在parent项目的pom文件中定义对common.jar的依赖,ABC三个子项目中只需要定义<parent></parent>,parent标签中写上parent项目的pom坐标就可以引用到common.jar了。

 

本项目坐标:

<!--artifactId一般是该项目的名字。它和groupID一起标识一个唯一的项目-->
  <groupId>com.xgss.com</groupId>
  <artifactId>xgss-maven</artifactId>
  <!--SNAPSHOT表示快照,说明该项目还处于开发阶段,是不稳定版本;建议version格式为:主版本.次版本.增量版本-限定版本号-->
  <version>0.0.1-SNAPSHOT</version>
  <!--项目产生的构件类型,例如jar、war、ear、pom等等。插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型。默认值jar。-->
  <packaging>war</packaging>

产物是如何储存在仓库中的?
存放到私服库时点符号将会被解析成目录分隔符,SNAPSHOT版本在私服库中会被解析成8位日期.时分秒毫秒-序号。序号代表第几次部署。
上面的坐标将会被解析成:com/xgss/com/xgss-maven/0.0.1-SNAPSHOT/xgss-maven-8位日期.时分秒毫秒-序号.jar
特例:如果你编译源代码将产物存放到本地仓库,将保持不变

dependencies
在父项目中的该标签下面的依赖的包,子项目中也会依赖

<!-- 该元素描述了项目相关的所有依赖 -->
<dependencies>
<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-core-asl</artifactId>
<!--依赖的版本号。可以配置成确定的版本号,也可以配置成版本号的范围。(, )不包含 [, ]包含 例如:[3.8,4.0) 表示3.8 - 4.0的版本,但是不包含4.0 -->
			<version>1.9.13</version>
<!--依赖类型,默认类型是jar。它通常表示依赖的文件的扩展名,但也有例外。一个类型可以被映射成另外一个扩展名或分类器。类型经常和使用的打包方式对应,尽管这也有例外。一些类型的例子:jar,war,ejb-client和test-jar。如果设置extensions为true,就可以在plugin里定义新的类型。所以前面的类型的例子不完整。-->
				<type>jar</type>
<!--依赖的分类器。分类器可以区分属于同一个POM,但不同构建方式的构件。分类器名被附加到文件名的版本号后面。例如,如果你想要构建两个单独的构件成JAR,一个使用Java1.4编译器,另一个使用Java6编译器,你就可以使用分类器来生成两个单独的JAR构件。-->
				<classifier></classifier>
<!--依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来

					-compile:compile是默认的范围;编译范围依赖在所有的classpath中可用,同时它们也会被打包。

					-provided:provided依赖只有在当JDK 或者一个容器已提供该依赖之后才使用。例如, 如果你开发了一个web 应用,你可能在编译 classpath 中需要可用的Servlet API 来编译一个servlet,但是你不会想要在打包好的WAR 中包含这个Servlet API;这个Servlet API JAR 由你的应用服务器或者servlet 容器提供。已提供范围的依赖在编译时 (不是运行时)可用。它不具有传递性的,也不会被打包。

					-runtime:runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如,你可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC驱动实现。

					-test: test范围依赖 在一般的 编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。

					-system:system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven也不会在仓库中去寻找它。如果你将一个依赖范围设置成系统范围,你必须同时提供一个systemPath元素。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的Maven仓库中引用依赖)。
					-->
				<scope>compile</scope>
<!--默认为false,即子项目默认都继承,为true,则子项目必需显示的引入。例如:假设项目A在编译时需要项目B的代码,但运行时并不需要项目B,而且我们可能并不需要所有项目都依赖项目B。-->
				<optional>false</optional>
<!--当计算传递依赖时,从依赖构件列表里,列出被排除的依赖构件集。即告诉maven你要排除所依赖项目的那些依赖。也可以使用通配符*排除所有依赖。此元素主要用于解决版本冲突问题.-->
				<exclusions>
					<exclusion>
						<artifactId>spring-core</artifactId>
						<groupId>org.springframework</groupId>
					</exclusion>
				</exclusions>
</dependency>
……
</dependencies>

dependencyManagement

用在被依赖的父项目中,定义了依赖的版本信息,当子项目声明指定依赖才会正在的加载该jar,不声明的不会依赖

<!--继承自该项目的所有子项目的默认依赖信息。这部分的依赖信息不会被立即解析,而是当子项目声明一个依赖(必须描述groupID和artifactID信息),如果groupID和artifactID以外的一些信息没有描述,则通过groupID和artifactID匹配到这里的依赖,并使用这里的依赖信息。-->

<dependencyManagement>
<!--参见dependencies元素-->
<dependencies>
<dependency>
......
</dependency>
</dependencies>
</dependencyManagement>

modules

<!--模块(有时称作子项目)被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径-->
<modules/>
<!-- Ps:继承和模块的区别:继承父不知子,但子知父。模块父知子,但子不知父。所以在具体的项目中一般都是继承和模块融合使用。 -->

properties

就跟定义变量一样

<!--键值对,Properties可以在整个POM中使用,也可以作为触发条件(见settings.xml配置文件里profiles→properties元素的说明)。格式是<name>value</name>。-->

<properties>
<dept>No</dept>
</properties>
如:<properties>
		<!-- 依赖版本定义 -->
		<springside.version>4.2.3-SNAPSHOT</springside.version>
</properties>

 引用时:<version>${springside.version}</version>

子pom中定义的名称和父pom中的名称一样的属性,子中会覆盖父的该属性,以子中定义的属性值为准

构建配置


<build>  
  
    <!-- 产生的构件的文件名,默认值是${artifactId}-${version}。 -->  
    <finalName>myPorjectName</finalName>  
  
    <!-- 构建产生的所有文件存放的目录,默认为${basedir}/target,即项目根目录下的target -->  
    <directory>${basedir}/target</directory>  
  
    <!--当项目没有规定目标(Maven2叫做阶段(phase))时的默认值, -->  
   <!--必须跟命令行上的参数相同例如jar:jar,或者与某个阶段(phase)相同例如install、compile等 -->  
   <defaultGoal>install</defaultGoal>  
 
   <!--当filtering开关打开时,使用到的过滤器属性文件列表。 -->  
   <!--项目配置信息中诸如${spring.version}之类的占位符会被属性文件中的实际值替换掉 -->  
   <filters>  
       <filter>../filter.properties</filter>  
   </filters>  
 
   <!--项目相关的所有资源路径列表,例如和项目相关的配置文件、属性文件,这些资源被包含在最终的打包文件里。 -->  
   <resources>  
       <resource>  
 
           <!--描述了资源的目标路径。该路径相对target/classes目录(例如${project.build.outputDirectory})。 -->  
           <!--举个例子,如果你想资源在特定的包里(org.apache.maven.messages),你就必须该元素设置为org/apache/maven/messages。 -->  
           <!--然而,如果你只是想把资源放到源码目录结构里,就不需要该配置。 -->  
           <targetPath>resources</targetPath>  
 
           <!--是否使用参数值代替参数名。参数值取自properties元素或者文件里配置的属性,文件在filters元素里列出。 -->  
           <filtering>true</filtering>  
 
           <!--描述存放资源的目录,该路径相对POM路径 -->  
           <directory>src/main/resources</directory>  
 
           <!--包含的模式列表 -->  
           <includes>  
               <include>**/*.properties</include>  
               <include>**/*.xml</include>  
           </includes>  
 
           <!--排除的模式列表 如果<include>与<exclude>划定的范围存在冲突,以<exclude>为准 -->  
           <excludes>  
               <exclude>jdbc.properties</exclude>  
           </excludes>  
 
       </resource>  
   </resources>  
 
   <!--单元测试相关的所有资源路径,配制方法与resources类似 -->  
   <testResources>  
       <testResource>  
           <targetPath />  
           <filtering />  
           <directory />  
           <includes />  
           <excludes />  
       </testResource>  
   </testResources>  
 
   <!--项目源码目录,当构建项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 -->  
   <sourceDirectory>${basedir}\src\main\java</sourceDirectory>  
 
   <!--项目脚本源码目录,该目录和源码目录不同, <!-- 绝大多数情况下,该目录下的内容会被拷贝到输出目录(因为脚本是被解释的,而不是被编译的)。 -->  
   <scriptSourceDirectory>${basedir}\src\main\scripts  
   </scriptSourceDirectory>  
 
   <!--项目单元测试使用的源码目录,当测试项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 -->  
   <testSourceDirectory>${basedir}\src\test\java</testSourceDirectory>  
 
   <!--被编译过的应用程序class文件存放的目录。 -->  
   <outputDirectory>${basedir}\target\classes</outputDirectory>  
 
   <!--被编译过的测试class文件存放的目录。 -->  
   <testOutputDirectory>${basedir}\target\test-classes  
   </testOutputDirectory>  
 
   <!--项目的一系列构建扩展,它们是一系列build过程中要使用的产品,会包含在running bulid‘s classpath里面。 -->  
   <!--他们可以开启extensions,也可以通过提供条件来激活plugins。 -->  
   <!--简单来讲,extensions是在build过程被激活的产品 -->  
   <extensions>  
 
       <!--例如,通常情况下,程序开发完成后部署到线上Linux服务器,可能需要经历打包、 -->  
       <!--将包文件传到服务器、SSH连上服务器、敲命令启动程序等一系列繁琐的步骤。 -->  
       <!--实际上这些步骤都可以通过Maven的一个插件 wagon-maven-plugin 来自动完成 -->  
       <!--下面的扩展插件wagon-ssh用于通过SSH的方式连接远程服务器, -->  
       <!--类似的还有支持ftp方式的wagon-ftp插件 -->  
       <extension>  
           <groupId>org.apache.maven.wagon</groupId>  
           <artifactId>wagon-ssh</artifactId>  
           <version>2.8</version>  
       </extension>  
 
   </extensions>  
 
   <!--使用的插件列表 。 -->  
   <plugins>  
       <plugin>  
           <groupId></groupId>  
           <artifactId>maven-assembly-plugin</artifactId>  
           <version>2.5.5</version>  
  
            <!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。 -->  
            <executions>  
                <execution>  
  
                    <!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标 -->  
                    <id>assembly</id>  
  
                    <!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段 -->  
                    <phase>package</phase>  
  
                    <!--配置的执行目标 -->  
                    <goals>  
                        <goal>single</goal>  
                    </goals>  
  
                    <!--配置是否被传播到子POM -->  
                    <inherited>false</inherited>  
  
                </execution>  
            </executions>  
  
            <!--作为DOM对象的配置,配置项因插件而异 -->  
            <configuration>  
                <finalName>${finalName}</finalName>  
                <appendAssemblyId>false</appendAssemblyId>  
                <descriptor>assembly.xml</descriptor>  
            </configuration>  
  
            <!--是否从该插件下载Maven扩展(例如打包和类型处理器), -->  
            <!--由于性能原因,只有在真需要下载时,该元素才被设置成true。 -->  
            <extensions>false</extensions>  
  
            <!--项目引入插件所需要的额外依赖 -->  
            <dependencies>  
                <dependency>...</dependency>  
            </dependencies>  
  
            <!--任何配置是否被传播到子项目 -->  
            <inherited>true</inherited>  
  
        </plugin>  
    </plugins>  
  
    <!--主要定义插件的共同元素、扩展元素集合,类似于dependencyManagement, -->  
    <!--所有继承于此项目的子项目都能使用。该插件配置项直到被引用时才会被解析或绑定到生命周期。 -->  
    <!--给定插件的任何本地配置都会覆盖这里的配置 -->  
    <pluginManagement>  
        <plugins>...</plugins>  
    </pluginManagement>  
  
</build>  
 

pom里面的仓库与setting.xml里的仓库功能是一样的。主要的区别在于,pom里的仓库是个性化的。比如一家大公司里的setting文件是公用的,所有项目都用一个setting文件,但各个子项目却会引用不同的第三方库,所以就需要在pom里设置自己需要的仓库地址。

build

<!--构建项目需要的信息-->
<build>
    <!-- 预定义执行的目标或者阶段,必须和命令行的参数相同。如:jar:jar或者clean install等等。例如:defaultGoal配置clean install ,在命令行输入mvn时会自动拼接成mvn clean install。偷懒的福音啊。-->
    <defaultGoal>install</defaultGoal>
    <!-- 编译输出目录,默认值${basedir}/target(不建议修改) -->
    <directory>${basedir}/target</directory>
    <!-- 构建产物的名称,没有文件扩展名。默认值${artifactId}-${version}。 -->
    <finalName>${artifactId}-${version}</finalName>
    <!-- 单独过滤某个文件,更多内容请访问如何过滤资源文件 -->
    <filters>
        <filter>src/main/filters/filter.properties</filter>
    </filters>
    <!--这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。-->
    <resources>
    <!--这个元素描述了项目相关的资源路径-->
        <resource>
            <!--  指定build后的resource存放的文件夹。该路径默认是basedir。通常被打包在JAR中的resources的目标路径为META-INF -->
            <targetPath></targetPath>
            <!--是否使用参数值代替参数名。如:aa=name 将my ${aa}显示为my name。true代表替换,false代表不替换。参数值取自properties元素、文件里配置的属性或者命令行的-D选项。有@aa@和${aa}俩种写法。更多内容请查看在线帮助-->
            <filtering>false</filtering>
            <!--描述存放资源的目录,该路径相对POM路径。默认值${basedir}/src/main/resources -->
            <directory>${basedir}/src/main/resources </directory>
            <!--用于指定要包括的文件。可以使用通配符*。例如**/*.xml。 -->
            <includes>
                      <include>configuration.xml</include>
             </includes>
            <!--用于指定不需要包括的文件。可以使用通配符*。例如**/*.xml。如果和includes的配置冲突,excludes的优先级更高。 -->
            <excludes>
                      <exclude>**/*.properties</exclude>
            </excludes>
        </resource>
    </resources>
    <!--该testResources元素块包含testResource元素。它们的定义是类似的resource 元素,仅在测试阶段使用。和resource元素唯一一点不同是testResource的默认值是${project.basedir}/src/test/resources。测试资源是不会部署。-->
    <testResources>
    <testResource>
    <targetPath/>
    <filtering/>
    <directory/>
    <includes/>
    <excludes/>
    </testResource>
    </testResources>
    <plugins>
    <!--plugin元素包含描述插件所需要的信息。-->
        <plugin>
            <!--插件在仓库里的groupID-->
            <groupId>org.apache.maven.plugins</groupId>
            <!--插件在仓库里的artifactID-->
            <artifactId>maven-jar-plugin</artifactId>
            <!--被使用的插件的版本(或版本范围)-->
            <version>2.0</version>
            <!--是否从该插件下载Maven扩展(例如打包和类型处理器),由于性能原因,只有在真需要下载时,该元素才被设置成enabled。-->
            <extensions>false</extensions>
            <!-- true 或 false ,这个插件的配置是否,可以继承。默认true。  -->
            <inherited>true</inherited>
            <!-- 请查阅https://maven.apache.org/pom.html#Plugins或者查阅中文版http://blog.csdn.net/tomato__/article/details/13625497 -->
            <configuration>
                <classifier>test</classifier>
            </configuration>
            <!-- 请参考dependencies元素  -->
            <dependencies>
                <dependency>
                  <groupId/>
                  <artifactId/>
                  <version/>
                  <type/>
                  <classifier/>
                  <scope/>
                  <systemPath/>
                  <exclusions>
                         <exclusion>
                           <artifactId/>
                           <groupId/>
                         </exclusion>
                  </exclusions>
                  <optional/>
                </dependency>
            </dependencies>
            <!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。-->
            <executions>
            <!--execution元素包含了插件执行需要的信息-->
                <execution>
                    <!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标-->
                    <id>echodir</id>
                    <!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段-->
                    <phase>verify</phase>
                    <!--配置的执行目标-->
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <!--配置是否被传播到子POM-->
                    <inherited>false</inherited>
                    <!-- 请查阅https://maven.apache.org/pom.html#Plugins -->
                    <configuration>
                        <tasks>
                            <echo>Build Dir: ${project.build.directory}</echo>
                        </tasks>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
    <!--子项目可以引用的默认插件信息。该插件配置项直到被引用时才会被解析或绑定到生命周期。给定插件的任何本地配置都会覆盖这里的配置-->
    <pluginManagement>
        <plugins>
        .................
        </plugins>
    </pluginManagement>
    <!--该元素设置了项目源码目录,当构建项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。-->
    <sourceDirectory>${basedir}/src/main/java</sourceDirectory>
    <!--该元素设置了项目脚本源码目录,该目录和源码目录不同:绝大多数情况下,该目录下的内容会被拷贝到输出目录(因为脚本是被解释的,而不是被编译的)。-->
    <scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory>
    <!--该元素设置了项目单元测试使用的源码目录,当测试项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。-->
    <testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
    <!--被编译过的应用程序class文件存放的目录。-->
    <outputDirectory>${basedir}/target/classes</outputDirectory>
    <!--被编译过的测试class文件存放的目录。-->
    <testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
    <!--使用来自该项目的一系列构建扩展-->
    <extensions>
        <!--描述使用到的构建扩展。-->
        <extension>
            <!--构建扩展的groupId-->
            <groupId/>
            <!--构建扩展的artifactId-->
            <artifactId/>
            <!--构建扩展的版本-->
            <version/>
        </extension>
    </extensions>
</build>

plugin

maven-compiler-plugin

<!-- 编译插件 -->  
<plugin>  
    <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-compiler-plugin</artifactId>  
    <configuration>  
        <source>1.6</source>  
        <target>1.6</target>  
        <encoding>${project.build.sourceEncoding}</encoding>  
    </configuration>  
</plugin> 

source: 源代码编译版本;  
target: 目标平台编译版本;  
encoding: 字符集编码。

maven-resources-plugin

<!-- 设置资源文件的编码方式 -->  
<plugin>  
    <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-resources-plugin</artifactId>  
    <version>2.4.3</version>  
    <executions>  
        <execution>  
            <phase>compile</phase>  
        </execution>  
    </executions>  
    <configuration>  
        <encoding>${project.build.sourceEncoding}</encoding>  
    </configuration>  
</plugin>  

xml、properties文件都是资源文件,编码的时候遇到中文总要进行转码!用什么编码?UTF-8,那就记得强制 <encoding>${project.build.sourceEncoding}</encoding>

maven-dependency-plugin

自动拷贝jar包到target目录

<!-- 依赖插件 -->  
<plugin>  
    <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-dependency-plugin</artifactId>  
    <version>2.6</version>  
    <executions>  
        <execution>  
            <id>copy-dependencies</id>  
            <phase>compile</phase>  
            <goals>  
                <goal>copy-dependencies</goal>  
            </goals>  
            <configuration>  
                <!-- ${project.build.directory}为Maven内置变量,缺省为target -->  
                <outputDirectory>${project.build.directory}/lib</outputDirectory>  
                <!-- 表示是否不包含间接依赖的包 -->  
                <excludeTransitive>false</excludeTransitive>  
                <!-- 表示复制的jar文件去掉版本信息 -->  
                <stripVersion>true</stripVersion>  
            </configuration>  
        </execution>  
    </executions>  
</plugin>  

在部署war包时,需要将项目依赖的jar包,也打到war包中,因此就会用到上述插件

maven-source-plugin

生成源代码jar包 

<!-- 源代码打包插件 -->  
<plugin>  
    <artifactId>maven-source-plugin</artifactId>  
    <version>2.1</version>  
    <configuration>  
        <!-- <finalName>${project.build.name}</finalName> -->  
        <attach>true</attach>  
        <encoding>${project.build.sourceEncoding}</encoding>  
    </configuration>  
    <executions>  
        <execution>  
            <phase>compile</phase>  
            <goals>  
                <goal>jar</goal>  
            </goals>  
        </execution>  
    </executions>  
</plugin>

该插件主要用于在打jar包时,把源代码也打成jar包

maven-jar-plugin

将项目打成jar包

<!-- jar包插件 -->  
<plugin>  
    <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-jar-plugin</artifactId>  
    <version>2.4</version>  
    <configuration>  
        <archive>  
            <manifest>  
                <!-- 告知 maven-jar-plugin添加一个 Class-Path元素到 MANIFEST.MF文件,以及在Class-Path元素中包括所有依赖项 -->  
                <addClasspath>true</addClasspath>  
                <!-- 所有的依赖项应该位于 lib文件夹 -->  
                <classpathPrefix>lib/</classpathPrefix>  
           <!-- 当用户使用 lib命令执行JAR文件时,使用该元素定义将要执行的类名 -->  
                <mainClass>com.zhengtian.tools.service.phone.MobilePhoneTool</mainClass>  
            </manifest>  
        </archive>  
    </configuration>  
</plugin>  

maven-war-plugin

将项目打成war包 

<!-- war插件 --> 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1.1</version>
    <configuration>  
        <!-- <warName>${project.build.name}</warName> -->
    </configuration>
</plugin>

 encoding: 强制字符集编码  

warName: war包名字——platform.war  

webappDirectory: 产生war前,用于存放构建war包的目录——target/platform。  

warSourceDirectory: 我把web工程搞成了eclipse下的WTP类型。

在将项目打成jar包时,有时会需要将项目打成可以直接运行的jar包,因此就需要将项目依赖的jar包也打入jar包中,此时需要在Eclipse上安装例外一个插件,用来打可执行jar包

tomcat-maven-plugin

利用tomcat-maven-plugin插件将项目自动打包并部署到tomcat中   

 

<!-- tomcat插件 -->  
    <plugin>  
        <groupId>org.codehaus.mojo</groupId>  
        <artifactId>tomcat-maven-plugin</artifactId>  
        <configuration>  
            <server>tomcat6-manager</server>  
            <path>/${project.build.name}</path>  
            <url>http://localhost:8080/manager</url>  
            <username>admin</username>  
            <password>admin</password>  
        </configuration>  
        <executions>  
            <execution>  
                <phase>deploy</phase>  
                <goals>  
                    <goal>deploy</goal>  
                </goals>  
            </execution>  
        </executions>  
    </plugin>  
</plugins>  

 

path: 是指项目部署到tomcat后的项目名称  

url: 是指tomcat的manager访问地址  

server: 这个是tomcat服务名称设置,需要配置maven的settings.xml文件,在servers节点中手动配置server,如下所示:  

<server>  
    <id>tomcat6-manager</id>  
    <username>admin</username>  
    <password>admin</password>  
</server>  

 

cargo-maven2-plugin

利用cargo-maven2-plugin插件将项目自动打包并部署到tomcat中   

配置描述:使用maven做web项目时,cargo插件可以帮助你完成WAR包到服务器的部署及服务器的启动和关闭等工作,方便,快速!

 

 

 

username和password: 是指tomcat的tomcat-users.xml文件中配置的,文件路径为E:\Program Files\tomcat-6.0.32\conf\tomcat-users.xml,如下所示:  

 

<role rolename=”manager”/>   

<user password=”admin” roles=”manager” username=”admin”/>    

 

注意,如果你的tomcat服务器的端口使用的不是默认的8080(如本例中的8088),则需要使用cargo.servlet.port参数将cargo的监听端口也配置到tomcat的那个监听端口(如本例中的8088),否则使用mvn cargo:run启动的服务器会在120000毫秒(120秒)后自动关闭!

mvn cargo:start命令完成WAR包部署后,启动服务器,然后会将服务器立即关掉;

mvn cargo:run命令完成WAR包部署后,启动服务器,直到你Ctrl+C将服务器关掉;

mvn cargo:stop命令关闭服务器。

 

build-helper-maven-plugin

<plugin>  
                <!-- 指定插件名称及版本号 -->  
                <groupId>org.codehaus.cargo</groupId>  
                <artifactId>cargo-maven2-plugin</artifactId>  
                <version>1.2.3</version>  
                <!-- 插件的Tomcat6.x配置 -->  
                <configuration>  
                    <!-- 容器的配置 -->  
                    <container>  
                        <!-- 指定服务器版本 -->  
                        <containerId>tomcat6x</containerId>  
                        <!-- 指定服务器的安装目录 -->  
                        <home>E:\Program Files\tomcat-6.0.32</home>  
                    </container>  
                    <!-- 具体的配置 -->  
                    <configuration>  
                        <!-- 部署模式:existing、standalone等 -->  
                        <type>existing</type>  
                        <!-- Tomcat的位置,即catalina.home -->  
                        <home>E:\Program Files\tomcat-6.0.32</home>  
                        <!-- 配置属性 -->  
                        <properties>  
                            <!-- 管理地址 -->  
                            <cargo.tomcat.manager.url>http://localhost:8080/manager</cargo.tomcat.manager.url>  
                            <!-- Tomcat用户名 -->  
                            <cargo.remote.username>admin</cargo.remote.username>  
                            <!-- Tomcat密码 -->  
                            <cargo.remote.password>admin</cargo.remote.password>  
                            <!--<cargo.jvmargs>-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8787 </cargo.jvmargs> -->  
                        </properties>  
                    </configuration>  
                </configuration>  
            </plugin>  

指定多个源代码目录插件

<plugin>  
                <groupId>org.codehaus.mojo</groupId>  
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>1.8</version>
                <executions>  
                    <execution>  
                        <id>add-source</id>  
                        <phase>initialize</phase>  
                        <goals>  
                            <goal>add-source</goal>  
                        </goals>  
                        <configuration>  
                            <sources>  
                                <source>${basedir}/src/main/four</source>  
                            </sources>  
                        </configuration>  
                    </execution>  
                </executions>  
  </plugin>  

 

cobertura-maven-plugin

测试覆盖率统计插插件

<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>cobertura-maven-plugin</artifactId>
      <version>2.5.1</version>
    </plugin>
  </plugins>
</build>

maven-enforcer-plugin

用来校验约定遵守情况 ( 或者说校验开发环境 ) 。比如 JDK 的版本 ,Maven 的版本 , 开发环境 (Linux,Windows 等 ), 依赖 jar 包的版本等等

maven-assembly-plugin

assembly插件,用于创建归档文件

versions-maven-plugin

帮助你管理Maven项目的各种版本信息

maven-antrun-plugin

让用户在Maven项目中运行Ant任务

exec-maven-plugin

它能让你运行任何本地的系统程序

maven测试相关的插件总结

可以运行项目的单元测试用例,并生成报告。使用者可以根据自己的需要配置测试选项以满足项目的测试需求。

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>2.19.1</version>
      <configuration>
        <!--设置包含的测试类 -->
        <includes>
          <include>******</include>
          <include>*/User*</include>
        </includes>
        <!-- 设置不进行测试类 -->
        <excludes>
          <exclude>Test*</exclude>
        </excludes>
        <!-- 跳过测试阶段,測試類写的有问题也会出错,一般不推荐 -->
        <!--<skip>true</skip> -->
      </configuration>
    </plugin>

    <!-- 构建项目站点报告插件 -->
    <plugin>     
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-site-plugin</artifactId>
      <version>3.0-beta-3</version>
      <configuration>
        <!-- 配置站点国际化 -->
        <locales>zh_CN</locales>
        <!-- 输出编码 -->
        <outputEncoding>GBK</outputEncoding>
      </configuration>
    </plugin>
    
    <!-- 项目API doc报告 -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-javadoc-plugin</artifactId>
      <version>2.7</version>
    </plugin>

    <!-- 单元测试报告html -->
    <plugin>      
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-report-plugin</artifactId>
      <version>2.12.2</version>
      <configuration>
        <showSuccess>false</showSuccess>
      </configuration>
    </plugin>
    
    <!-- 测试覆盖率的报告 -->
    <plugin>      
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>cobertura-maven-plugin</artifactId>
      <version>2.5.1</version>
      <configuration>
        <formats>
          <format>html</format>
          <format>xml</format>
        </formats>
      </configuration>
      <executions>
        <execution>
          <id>cobertura-report</id>
          <goals>
            <goal>cobertura</goal>
          </goals>
          <phase>test</phase>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

reporting

<!--该元素描述使用报表插件产生报表的规范。当用户执行“mvn site”,这些报表就会运行。在页面导航栏能看到所有报表的链接。-->
<reporting>
    <!--所有产生的报表存放到哪里。默认值是${basedir}/target/site。-->
    <outputDirectory>${basedir}/target/site</outputDirectory>
    <!--如果为true,则网站不包括默认的报表。这包括“项目信息”菜单中的报表。默认false-->
    <excludeDefaults>false</excludeDefaults>
    <!--使用的报表插件和他们的配置。-->
    <plugins>
    <!--plugin元素包含描述报表插件需要的信息-->
        <plugin>
            <!--报表插件在仓库里的groupID,默认值是 : org.apache.maven.plugins 。-->
            <groupId>org.apache.maven.plugins</groupId>
            <!--报表插件在仓库里的artifactID-->
            <artifactId>maven-project-info-reports-plugin</artifactId>
            <!--被使用的报表插件的版本(或版本范围)-->
            <version>2.7</version>
            <!--任何配置是否被传播到子项目,默认true-->
            <inherited>true</inherited>
            <!--报表插件的配置-->
            <configuration/>
            <!--一组报表的多重规范,每个规范可能有不同的配置。一个规范(报表集)对应一个执行目标。例如,有1,2,3,4,5,6,7,8,9个报表。1,2,5构成A报表集,对应一个执行目标。2,5,8构成B报表集,对应另一个执行目标-->
            <reportSets>
                <!--表示报表的一个集合,以及产生该集合的配置-->
                <reportSet>
                    <!--报表集合的唯一标识符,POM继承时用到,默认值:default -->
                    <id>default</id>
                    <!--产生报表集合时,被使用的报表的配置-->
                    <configuration/>
                    <!--配置是否被继承到子POMs-->
                    <inherited/>
                    <!--这个集合里使用到哪些报表-->
                    <reports/>
                </reportSet>
            </reportSets>
        </plugin>
    <plugins/>
<reporting/>

分发配置

 


<!--项目分发信息,在执行mvn deploy后表示要发布的位置。 -->  
<!--有了这些信息就可以把网站部署到远程服务器或者把构件部署到远程仓库。 -->  
<distributionManagement>
    <!--部署项目产生的构件到远程仓库需要的信息 -->  
    <repository>
        <!--是分配给快照一个唯一的版本号(由时间戳和构建流水号),还是每次都使用相同的版本号 -->  
        <!--参见repositories/repository元素 -->  
        <uniqueVersion>true</uniqueVersion>
        <id> repo-id </id>  
        <name> repo-name</name>  
        <url>file://${basedir}/target/deploy </url>  
        <layout />  
  
    </repository>  
  
    <!--构件的快照部署到哪里,如果没有配置该元素,默认部署到repository元素配置的仓库 -->  
    <snapshotRepository>  
        <uniqueVersion />  
        <id />  
        <name />  
        <url />  
        <layout />  
    </snapshotRepository>  
  
    <!--部署项目的网站需要的信息 -->  
    <site>
        <!--部署位置的唯一标识符,用来匹配站点和settings.xml文件里的配置 -->  
        <id> site-id </id>
        <!--部署位置的名称 -->  
        <name> site-name</name>
        <!--部署位置的URL,按protocol://hostname/path形式 -->  
        <url>scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web </url>
    </site>
    <!--项目下载页面的URL。如果没有该元素,用户应该参考主页。 -->  
    <!--使用该元素的原因是:帮助定位那些不在仓库里的构件(由于license限制)。 -->  
    <downloadUrl />  
  
    <!--如果构件有了新的groupID和artifact ID(构件移到了新的位置),这里列出构件的重定位信息。 -->  
    <relocation>
        <!--构件新的group ID -->  
        <groupId />
        <!--构件新的artifact ID -->  
        <artifactId />
        <!--构件新的版本号 -->  
        <version />
        <!--显示给用户的,关于移动的额外信息,例如原因。 -->  
        <message /> 
    </relocation> 
    <!--给出该构件在远程仓库的状态。不得在本地项目中设置该元素,因为这是工具自动更新的。 -->  
    <!--有效的值有:none(默认),converted(仓库管理员从Maven 1 POM转换过来), -->  
    <!--partner(直接从伙伴Maven 2仓库同步过来),deployed(从Maven 2实例部署),verified(被核实时正确的和最终的)。 -->  
    <status />
</distributionManagement>

仓库配置


<!--发现依赖和扩展的远程仓库列表。 -->  
<repositories>
    <!--包含需要连接到远程仓库的信息 -->  
    <repository>
        <!--如何处理远程仓库里发布版本的下载 -->  
        <releases>
            <!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 -->  
            <enabled />
            <!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。 -->  
            <!--这里的选项是:always(一直),daily(默认,每日), -->  
            <!--interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 -->  
            <updatePolicy />  
  
            <!--当Maven验证构件校验文件失败时该怎么做: -->  
            <!--ignore(忽略),fail(失败),或者warn(警告)。 -->  
            <checksumPolicy />
        </releases>  
  
        <!--如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置, -->  
        <!--POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。 -->  
        <!--例如,可能有人会决定只为开发目的开启对快照版本下载的支持 -->  
        <snapshots>  
            <enabled />  
            <updatePolicy />  
            <checksumPolicy />  
        </snapshots>  
  
        <!--远程仓库唯一标识符。可以用来匹配在settings.xml文件里配置的远程仓库 -->  
        <id> repo-id </id>  
  
        <!--远程仓库名称 -->  
        <name> repo-name</name>  
  
        <!--远程仓库URL,按protocol://hostname/path形式 -->  
        <url>http://192.168.1.169:9999/repository/ </url>  
  
        <!--用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。 -->  
        <!--Maven 2为其仓库提供了一个默认的布局; -->  
        <!--然而,Maven1.x有一种不同的布局。 -->  
        <!--我们可以使用该元素指定布局是default(默认)还是legacy(遗留)。 -->  
        <layout> default</layout>
    </repository>  
  
</repositories>  
  
<!--发现插件的远程仓库列表,这些插件用于构建和报表 -->  
<pluginRepositories>
    <!--包含需要连接到远程插件仓库的信息.参见repositories/repository元素 -->  
    <pluginRepository />
</pluginRepositories>  

profile配置


<!--在列的项目构建profile,如果被激活,会修改构建处理 -->  
<profiles>  
  
    <!--根据环境参数或命令行参数激活某个构建处理 -->  
    <profile>  
        <!--自动触发profile的条件逻辑。Activation是profile的开启钥匙。 -->  
        <activation>  
  
            <!--profile默认是否激活的标识 -->  
            <activeByDefault>false</activeByDefault>  
  
            <!--activation有一个内建的java版本检测,如果检测到jdk版本与期待的一样,profile被激活。 -->  
            <jdk>1.7</jdk>  
  
            <!--当匹配的操作系统属性被检测到,profile被激活。os元素可以定义一些操作系统相关的属性。 -->  
            <os>  
  
                <!--激活profile的操作系统的名字 -->  
                <name>Windows XP</name>  
  
                <!--激活profile的操作系统所属家族(如 'windows') -->  
                <family>Windows</family>  
  
                <!--激活profile的操作系统体系结构 -->  
                <arch>x86</arch>  
  
                <!--激活profile的操作系统版本 -->  
                <version>5.1.2600</version>  
  
            </os>  
  
            <!--如果Maven检测到某一个属性(其值可以在POM中通过${名称}引用),其拥有对应的名称和值,Profile就会被激活。 -->  
            <!-- 如果值字段是空的,那么存在属性名称字段就会激活profile,否则按区分大小写方式匹配属性值字段 -->  
            <property>  
  
                <!--激活profile的属性的名称 -->  
                <name>mavenVersion</name>  
  
                <!--激活profile的属性的值 -->  
                <value>2.0.3</value>  
  
            </property>  
  
            <!--提供一个文件名,通过检测该文件的存在或不存在来激活profile。missing检查文件是否存在,如果不存在则激活profile。 -->  
            <!--另一方面,exists则会检查文件是否存在,如果存在则激活profile。 -->  
            <file>  
  
                <!--如果指定的文件存在,则激活profile。 -->  
                <exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</exists>  
  
                <!--如果指定的文件不存在,则激活profile。 -->  
                <missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</missing>  
  
            </file>  
  
        </activation>  
        <id />  
        <build />  
        <modules />  
        <repositories />  
        <pluginRepositories />  
        <dependencies />  
        <reporting />  
        <dependencyManagement />  
        <distributionManagement />  
        <properties />  
    </profile>  

profile配置项在setting.xml中也有,是pom.xml中profile元素的裁剪版本,包含了id,activation, repositories, pluginRepositories和 properties元素。这里的profile元素只包含这五个子元素是因为setting.xml只关心构建系统这个整体(这正是settings.xml文件的角色定位),而非单独的项目对象模型设置。如果一个settings中的profile被激活,它的值会覆盖任何其它定义在POM中或者profile.xml中的带有相同id的profile。
 
pom.xml中的profile可以看做pom.xml的副本,拥有与pom.xml相同的子元素与配置方法。它包含可选的activation(profile的触发器)和一系列的changes。例如test过程可能会指向不同的数据库(相对最终的deployment)或者不同的dependencies或者不同的repositories,并且是根据不同的JDK来改变的。只需要其中一个成立就可以激活profile,如果第一个条件满足了,那么后面就不会在进行匹配。

报表配置


<!--描述使用报表插件产生报表的规范,特定的maven 插件能输出相应的定制和配置报表. -->  
<!--当用户执行“mvn site”,这些报表就会运行,在页面导航栏能看到所有报表的链接。 -->  
<reporting>  
    <!--true,则网站不包括默认的报表。这包括“项目信息”菜单中的报表。 -->  
    <excludeDefaults />  
    <!--所有产生的报表存放到哪里。默认值是${project.build.directory}/site。 -->  
    <outputDirectory />  
    <!--使用的报表插件和他们的配置。 -->  
    <plugins>  
        <plugin>  
            <groupId />  
            <artifactId />  
            <version />  
            <inherited />  
            <configuration>  
                <links>  
                    <link>http://java.sun.com/j2se/1.5.0/docs/api/</link>  
                </links>  
            </configuration>  
            <!--一组报表的多重规范,每个规范可能有不同的配置。 -->  
            <!--一个规范(报表集)对应一个执行目标 。例如,有1,2,3,4,5,6,7,8,9个报表。 -->  
            <!--1,2,5构成A报表集,对应一个执行目标。2,5,8构成B报表集,对应另一个执行目标 -->  
            <reportSets>  
                <!--表示报表的一个集合,以及产生该集合的配置 -->  
                <reportSet>  
                    <!--报表集合的唯一标识符,POM继承时用到 -->  
                    <id>sunlink</id>  
                    <!--产生报表集合时,被使用的报表的配置 -->  
                    <configuration />  
                    <!--配置是否被继承到子POMs -->  
                    <inherited />  
                    <!--这个集合里使用到哪些报表 -->  
                    <reports>  
                        <report>javadoc</report>  
                    </reports>  
                </reportSet>  
            </reportSets>  
        </plugin>  
    </plugins>  
</reporting>    

环境配置


<!--项目的问题管理系统(Bugzilla, Jira, Scarab,或任何你喜欢的问题管理系统)的名称和URL,本例为 jira -->  
<issueManagement>  
    <!--问题管理系统(例如jira)的名字, -->  
    <system> jira </system>  
    <!--该项目使用的问题管理系统的URL -->  
    <url> http://jira.clf.com/</url>  
</issueManagement>  
  
<!--项目持续集成信息 -->  
<ciManagement>
    <!--持续集成系统的名字,例如continuum -->
    <system />
    <!--该项目使用的持续集成系统的URL(如果持续集成系统有web接口的话)。 -->
    <url />
    <!--构建完成时,需要通知的开发者/用户的配置项。包括被通知者信息和通知条件(错误,失败,成功,警告) -->
    <notifiers>
        <!--配置一种方式,当构建中断时,以该方式通知用户/开发者 -->
        <notifier>
            <!--传送通知的途径 -->
            <type />
            <!--发生错误时是否通知 -->
            <sendOnError />
            <!--构建失败时是否通知 -->
            <sendOnFailure />
            <!--构建成功时是否通知 -->
            <sendOnSuccess />
            <!--发生警告时是否通知 -->
            <sendOnWarning />
            <!--不赞成使用。通知发送到哪里 -->
            <address />
            <!--扩展配置项 -->
            <configuration />  
        </notifier>  
    </notifiers>  
  
</ciManagement>  

环境设置

issueManagement

<!--项目的问题管理系统(Bugzilla,Jira,Scarab,或任何你喜欢的问题管理系统)的名称和URL,本例为jira-->
<issueManagement>
    <!--问题管理系统(例如jira)的名字,-->
    <system>jira</system>
    <!--该项目使用的问题管理系统的URL-->
    <url>http://jira.baidu.com/banseon</url>
</issueManagement>

ciManagement

<!--项目持续集成信息 -->

<ciManagement>
	<!--持续集成系统的名字,例如continuum -->
	<system>continuum</system>
	<!--该项目使用的持续集成系统的URL(如果持续集成系统有web接口的话)。 -->
	<url>http://127.0.0.1:8080/continuum</url>
	<!--构建完成时,需要通知的开发者/用户的配置项。包括被通知者信息和通知条件(错误,失败,成功,警告) -->
	<notifiers>
		<!--配置一种方式,当构建中断时,以该方式通知用户/开发者 -->
		<notifier>
			<!--传送通知的途径 -->
			<type>mail</type>
			<!--发生错误时是否通知 -->
			<sendOnError>true</sendOnError>
			<!--构建失败时是否通知 -->
			<sendOnFailure>true</sendOnFailure>
			<!--构建成功时是否通知 -->
			<sendOnSuccess>false</sendOnSuccess>
			<!--发生警告时是否通知 -->
			<sendOnWarning>false</sendOnWarning>
			<!--弃用。通知发送到哪里 -->
			<address />
			<!--通知扩展配置项 -->
			<configuration>
				<address>continuum@127.0.0.1</address>
			</configuration>
		</notifier>
	</notifiers>
</ciManagement>

mailingLists

<!--项目相关邮件列表信息 -->
<mailingLists>
	<!--该元素描述了项目相关的所有邮件列表。自动产生的网站引用这些信息。 -->
	<mailingList>
		<!--邮件的名称 -->
		<name>User List</name>
		<!--发送邮件的地址或链接,如果是邮件地址,创建文档时,mailto:链接会被自动创建 -->
		<post>user@127.0.0.1</post>
		<!--订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto:链接会被自动创建 -->
		<subscribe>user-subscribe@127.0.0.1</subscribe>
		<!--取消订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto:链接会被自动创建 -->
		<unsubscribe>user-unsubscribe@127.0.0.1</unsubscribe>
		<!--你可以浏览邮件信息的URL -->
		<archive>http://127.0.0.1/user/</archive>
		<!--备用url的链接,可以浏览存档列表。 -->
		<otherArchives>
			<otherArchive>http://base.google.com/base/1/127.0.0.1</otherArchive>
        </otherArchives>
	</mailingList>
</mailingLists>

scm

<!--SCM(Source Control Management)标签允许你配置你的代码库,供Maven web站点和其它插件使用。 -->
<scm>
	<!--SCM的URL,该URL描述了版本库和如何连接到版本库。欲知详情,请看SCMs提供的URL格式和支持列表。该连接只读。 -->
	<connection>scm:svn:http://127.0.0.1/svn/my-project</connection>
	<!--给开发者使用的,类似connection元素。即该连接不仅仅只读 -->
	<developerConnection>scm:svn:https://127.0.0.1/svn/my-project
	</developerConnection>
	<!--当前代码的标签,在开发阶段默认为HEAD -->
	<tag>HEAD</tag>
	<!--指向项目的可浏览SCM库(例如ViewVC或者Fisheye)的URL。 -->
	<url>http://127.0.0.1/websvn/my-project</url>
</scm>

prerequisites

<!--描述了这个项目构建环境中的前提条件。 -->
<prerequisites>
	<!--构建该项目或使用该插件所需要的Maven的最低版本。默认值:2.0 -->
	<maven>2.0.6</maven>
</prerequisites>

repositories

<!--远程仓库列表,它是Maven用来填充构建系统本地仓库所使用的一组远程项目。 -->
<repositories>
	<!--包含需要连接到远程仓库的信息 -->
	<repository>
		<!--远程仓库唯一标识 -->
		<id>codehausSnapshots</id>
		<!--远程仓库名称 -->
		<name>Codehaus Snapshots</name>
		<!--如何处理远程仓库里发布版本的下载 -->
		<releases>
			<!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 -->
			<enabled>false</enabled>
			<!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 -->
			<updatePolicy>always</updatePolicy>
			<!--当Maven验证构件校验文件失败时该怎么做-ignore(忽略),fail(失败),或者warn(警告)。 -->
			<checksumPolicy>warn</checksumPolicy>
		</releases>
		<!--如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。例如,可能有人会决定只为开发目的开启对快照版本下载的支持。参见repositories/repository/releases元素 -->
		<snapshots>
			<enabled />
			<updatePolicy />
			<checksumPolicy />
		</snapshots>
		<!--远程仓库URL,按protocol://hostname/path形式 -->
		<url>http://snapshots.maven.codehaus.org/maven2</url>
		<!--用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven 2为其仓库提供了一个默认的布局;然而,Maven 
			1.x有一种不同的布局。我们可以使用该元素指定布局是default(默认)还是legacy(遗留)。 -->
		<layout>default</layout>
	</repository>
</repositories>

pluginRepositories

<!--包含需要连接到远程插件仓库的信息.参见repositories/repository元素 -->

<pluginRepositories>
	<pluginRepository>
		<releases>
			<enabled />
			<updatePolicy />
			<checksumPolicy />
		</releases>
		<snapshots>
			<enabled />
			<updatePolicy />
			<checksumPolicy />
		</snapshots>
		<id />
		<name />
		<url />
		<layout />
	</pluginRepository>
</pluginRepositories>

distributionManagement

<!--项目分发信息,在执行mvndeploy后表示要发布的位置。有了这些信息就可以把网站部署到远程服务器或者把构件部署到远程仓库。 -->
<distributionManagement>
	<!--部署项目产生的构件到远程仓库需要的信息,参见repositories/repository元素 -->
	<repository>
		<!--true:分配给快照一个唯一的版本号(由时间戳和构建流水号组成)。false:每次都使用相同的版本号 -->
		<uniqueVersion>true</uniqueVersion>
		<id />
		<name />
		<url />
		<layout />
		<releases>
			<enabled />
			<updatePolicy />
			<checksumPolicy />
		</releases>
		<snapshots>
			<enabled />
			<updatePolicy />
			<checksumPolicy />
		</snapshots>
	</repository>
	<!--构件的快照部署到哪里? -->
	<snapshotRepository>
		<uniqueVersion>true</uniqueVersion>
		<id />
		<name />
		<url />
		<layout />
		<releases>
			<enabled />
			<updatePolicy />
			<checksumPolicy />
		</releases>
		<snapshots>
			<enabled />
			<updatePolicy />
			<checksumPolicy />
		</snapshots>
	</snapshotRepository>
	<!--部署项目的网站需要的信息 -->
	<site>
		<!--部署位置的唯一标识符,用来匹配站点和settings.xml文件里的配置 -->
		<id>banseon-site</id>
		<!--部署位置的名称 -->
		<name>businessapiwebsite</name>
		<!--部署位置的URL,按protocol://hostname/path形式 -->
		<url>
			scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web
		</url>
	</site>
	<!--项目下载页面的URL。如果没有该元素,用户应该参考主页。使用该元素的原因是:帮助定位那些不在仓库里的构件(由于license限制)。 -->
	<downloadUrl />
	<!--如果构件有了新的groupID和artifactID(构件移到了新的位置),这里列出构件的重定位信息。 -->
	<relocation>
		<!--构件新的groupID -->
		<groupId />
		<!--构件新的artifactID -->
		<artifactId />
		<!--构件新的版本号 -->
		<version />
		<!--显示给用户的,关于移动的额外信息,例如原因。 -->
		<message />
	</relocation>
	<!--给出该构件在远程仓库的状态。不得在本地项目中设置该元素,因为这是工具自动更新的。有效的值有:none(默认),converted(仓库管理员从Maven1 
		POM转换过来),partner(直接从伙伴Maven2仓库同步过来),deployed(从Maven2实例部署),verified(被核实时正确的和最终的)。 -->
	<status />
</distributionManagement>

profiles

<!--在列的项目构建profile,如果被激活,会修改构建处理 -->
<profiles>
	<!--根据环境参数或命令行参数激活某个构建处理 -->
	<profile>
		<!--构建配置的唯一标识符。即用于命令行激活,也用于在继承时合并具有相同标识符的profile。 -->
		<id>test</id>
		<!--自动触发profile的条件逻辑。Activation是profile的开启钥匙。如POM中的profile一样,profile的力量来自于它能够在某些特定的环境中自动使用某些特定的值;这些环境通过activation元素指定。activation元素并不是激活profile的唯一方式。settings.xml文件中的activeProfile元素可以包含profile的id。profile也可以通过在命令行,使用-P标记和逗号分隔的列表来显式的激活(如,-P	test)。 -->
		<activation>
			<!--profile默认是否激活的标识 -->
			<activeByDefault>false</activeByDefault>
			<!--当匹配的jdk被检测到,profile被激活。例如,1.4激活JDK1.4,1.4.0_2,而!1.4激活所有版本不是以1.4开头的JDK。 -->
			<jdk>1.5</jdk>
			<!--当匹配的操作系统属性被检测到,profile被激活。os元素可以定义一些操作系统相关的属性。 -->
			<os>
				<!--激活profile的操作系统的名字 -->
				<name>Windows XP</name>
				<!--激活profile的操作系统所属家族(如 'windows') -->
				<family>Windows</family>
				<!--激活profile的操作系统体系结构 -->
				<arch>x86</arch>
				<!--激活profile的操作系统版本 -->
				<version>5.1.2600</version>
			</os>
			<!--如果Maven检测到某一个属性(其值可以在POM中通过${name}引用),其拥有对应的name = 值,Profile就会被激活。如果值字段是空的,那么存在属性名称字段就会激活profile,否则按区分大小写方式匹配属性值字段 -->
			<property>
				<!--激活profile的属性的名称 -->
				<name>mavenVersion</name>
				<!--激活profile的属性的值 -->
				<value>2.0.3</value>
			</property>
			<!--提供一个文件名,通过检测该文件的存在或不存在来激活profile。missing检查文件是否存在,如果不存在则激活profile。另一方面,exists则会检查文件是否存在,如果存在则激活profile。 -->
			<file>
				<!--如果指定的文件存在,则激活profile。 -->
				<exists>${basedir}/file2.properties</exists>
				<!--如果指定的文件不存在,则激活profile。 -->
				<missing>${basedir}/file1.properties</missing>
			</file>
		</activation>
		<!--构建项目所需要的信息。参见build元素 -->
		<build>
			<defaultGoal />
			<resources>
				<resource>
					<targetPath />
					<filtering />
					<directory />
					<includes />
					<excludes />
				</resource>
			</resources>
			<testResources>
				<testResource>
					<targetPath />
					<filtering />
					<directory />
					<includes />
					<excludes />
				</testResource>
			</testResources>
			<directory />
			<finalName />
			<filters />
			<pluginManagement>
				<plugins>
				<!--参见build/pluginManagement/plugins/plugin元素 -->
					<plugin>
						<groupId />
						<artifactId />
						<version />
						<extensions />
						<executions>
							<execution>
								<id />
								<phase />
								<goals />
								<inherited />
								<configuration />
							</execution>
						</executions>
						<dependencies>
				<!--参见dependencies/dependency元素 -->
							<dependency>
								......
							</dependency>
						</dependencies>
						<goals />
						<inherited />
						<configuration />
					</plugin>
				</plugins>
			</pluginManagement>
			<plugins>
	<!--参见build/pluginManagement/plugins/plugin元素 -->
				<plugin>
					<groupId />
					<artifactId />
					<version />
					<extensions />
					<executions>
						<execution>
							<id />
							<phase />
							<goals />
							<inherited />
							<configuration />
						</execution>
					</executions>
					<dependencies>
						<!--参见dependencies/dependency元素 -->
						<dependency>
							......
						</dependency>
					</dependencies>
					<goals />
					<inherited />
					<configuration />
				</plugin>
			</plugins>
		</build>
		<!--发现依赖和扩展的远程仓库列表。 -->
		<repositories>
			<!--参见repositories/repository元素 -->
			<repository>
				<releases>
					<enabled />
					<updatePolicy />
					<checksumPolicy />
				</releases>
				<snapshots>
					<enabled />
					<updatePolicy />
					<checksumPolicy />
				</snapshots>
				<id />
				<name />
				<url />
				<layout />
			</repository>
		</repositories>
		<!--该元素描述了项目相关的所有依赖。这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。要获取更多信息,请看项目依赖机制。 -->
		<dependencies>
			<!--参见dependencies/dependency元素 -->
			<dependency>
				......
			</dependency>
		</dependencies>
		<!--不赞成使用.现在Maven忽略该元素. -->
		<reports />
		<!--参见distributionManagement元素 -->
		<distributionManagement>
			......
		</distributionManagement>
		<!--参见properties元素 -->
		<properties />
	</profile>
</profiles>
</project>

项目信息配置


<!--项目的名称, Maven产生的文档用 -->  
<name>banseon-maven </name>  
  
<!--项目主页的URL, Maven产生的文档用 -->  
<url>http://www.clf.com/ </url>  
  
<!--项目的详细描述, Maven 产生的文档用。 当这个元素能够用HTML格式描述时 -->  
<!--(例如,CDATA中的文本会被解析器忽略,就可以包含HTML标签),不鼓励使用纯文本描述。 -->  
<!-- 如果你需要修改产生的web站点的索引页面,你应该修改你自己的索引页文件,而不是调整这里的文档。 -->  
<description>A maven project to study maven. </description>  
  
<!--描述了这个项目构建环境中的前提条件。 -->  
<prerequisites>  
  
    <!--构建该项目或使用该插件所需要的Maven的最低版本 -->  
    <maven />  
  
</prerequisites>  
  
<!--项目创建年份,4位数字。当产生版权信息时需要使用这个值。 -->  
<inceptionYear />  
  
<!--项目相关邮件列表信息 -->  
<mailingLists>  
  
    <!--该元素描述了项目相关的所有邮件列表。自动产生的网站引用这些信息。 -->  
    <mailingList>  
  
        <!--邮件的名称 -->  
        <name> Demo </name>  
  
        <!--发送邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 -->  
        <post> clf@126.com</post>  
  
        <!--订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 -->  
        <subscribe> clf@126.com</subscribe>  
  
        <!--取消订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 -->  
        <unsubscribe> clf@126.com</unsubscribe>  
  
        <!--你可以浏览邮件信息的URL -->  
        <archive> http:/hi.clf.com/</archive>  
  
    </mailingList>  
  
</mailingLists>  
  
<!--项目开发者列表 -->  
<developers>  
  
    <!--某个项目开发者的信息 -->  
    <developer>  
  
        <!--SCM里项目开发者的唯一标识符 -->  
        <id> HELLO WORLD </id>  
  
        <!--项目开发者的全名 -->  
        <name> banseon </name>  
  
        <!--项目开发者的email -->  
        <email> banseon@126.com</email>  
  
        <!--项目开发者的主页的URL -->  
        <url />  
  
        <!--项目开发者在项目中扮演的角色,角色元素描述了各种角色 -->  
        <roles>  
            <role> Project Manager</role>  
            <role>Architect </role>  
        </roles>  
  
        <!--项目开发者所属组织 -->  
        <organization> demo</organization>  
  
        <!--项目开发者所属组织的URL -->  
        <organizationUrl>http://hi.clf.com/ </organizationUrl>  
  
        <!--项目开发者属性,如即时消息如何处理等 -->  
        <properties>  
            <dept> No </dept>  
        </properties>  
  
        <!--项目开发者所在时区, -11到12范围内的整数。 -->  
        <timezone> -5</timezone>  
  
    </developer>  
  
</developers>  
  
<!--项目的其他贡献者列表 -->  
<contributors>  
  
    <!--项目的其他贡献者。参见developers/developer元素 -->  
    <contributor>  
        <name />  
        <email />  
        <url />  
        <organization />  
        <organizationUrl />  
        <roles />  
        <timezone />  
        <properties />  
    </contributor>  
  
</contributors>  
  
<!--该元素描述了项目所有License列表。应该只列出该项目的license列表,不要列出依赖项目的license列表。 -->  
<!--如果列出多个license,用户可以选择它们中的一个而不是接受所有license。 -->  
<licenses>  
  
    <!--描述了项目的license,用于生成项目的web站点的license页面,其他一些报表和validation也会用到该元素。 -->  
    <license>  
  
        <!--license用于法律上的名称 -->  
        <name> Apache 2 </name>  
  
        <!--官方的license正文页面的URL -->  
        <url>http://www.clf.com/LICENSE-2.0.txt </url>  
  
        <!--项目分发的主要方式: repo,可以从Maven库下载 manual, 用户必须手动下载和安装依赖 -->  
        <distribution> repo</distribution>  
  
        <!--关于license的补充信息 -->  
        <comments> Abusiness-friendly OSS license </comments>  
  
    </license>  
  
</licenses>  
  
<!--SCM(Source Control Management)标签允许你配置你的代码库,供Maven web站点和其它插件使用。 -->  
<scm>  
  
    <!--SCM的URL,该URL描述了版本库和如何连接到版本库。欲知详情,请看SCMs提供的URL格式和列表。该连接只读。 -->  
    <connection>scm:svn:http://svn.baidu.com/banseon/maven/</connection>  
  
    <!--给开发者使用的,类似connection元素。即该连接不仅仅只读 -->  
    <developerConnection>scm:svn:http://svn.baidu.com/banseon/maven/  
    </developerConnection>  
  
    <!--当前代码的标签,在开发阶段默认为HEAD -->  
    <tag />  
  
    <!--指向项目的可浏览SCM库(例如ViewVC或者Fisheye)的URL。 -->  
    <url> http://svn.baidu.com/banseon</url>  
  
</scm>  
  
<!--描述项目所属组织的各种属性。Maven产生的文档用 -->  
<organization>  
  
    <!--组织的全名 -->  
    <name> demo </name>  
  
    <!--组织主页的URL -->  
    <url> http://www.clf.com/</url>  
  
</organization> 

name

<!--项目的名称,Maven产生的文档用-->
<name>banseon-maven</name>

description

<!--项目的详细描述,Maven产生的文档用。当这个元素能够用HTML格式描述时(例如,CDATA中的文本会被解析器忽略,就可以包含HTML标签),不鼓励使用纯文本描述。如果你需要修改产生的web站点的索引页面,你应该修改你自己的索引页文件,而不是调整这里的文档。-->
<description>Amavenprojecttostudymaven.</description>

url

<!--项目主页的URL,Maven产生的文档用-->
<url>http://www.baidu.com/banseon</url>

inceptionYear

<!--项目创建年份,4位数字。当产生版权信息时需要使用这个值。-->
<inceptionYear/>

licenses

<!--该元素描述了项目所有License列表。应该只列出该项目的license列表,不要列出依赖项目的license列表。如果列出多个license,用户可以选择它们中的一个而不是接受所有license。 -->
<licenses>
	<!--描述了项目的license,用于生成项目的web站点的license页面,其他一些报表和validation也会用到该元素。 -->
	<license>
		<!--完整的法律许可的名称。 -->
		<name>Apache2</name>
		<!--官方的license正文页面的URL -->
		<url>http://www.baidu.com/banseon/LICENSE-2.0.txt</url>
		<!--项目分发的主要方式: repo,可以从Maven库下载 manual,用户必须手动下载和安装依赖 -->
		<distribution>repo</distribution>
		<!--关于license的补充信息 -->
		<comments>Abusiness-friendlyOSSlicense</comments>
	</license>
</licenses>

organization

<!--描述项目所属组织的各种属性。Maven产生的文档用 -->
<organization>
	<!--组织的全名 -->
	<name>demo</name>
	<!--组织主页的URL -->
	<url>http://www.baidu.com/banseon</url>
</organization>

developers

<!--项目开发者列表 -->
<developers>
	<!--某个项目开发者的信息 -->
	<developer>
		<!--SCM里项目开发者的唯一标识符 -->
		<id>HELLOWORLD</id>
		<!--项目开发者的全名 -->
		<name>banseon</name>
		<!--项目开发者的email -->
		<email>banseon@126.com</email>
		<!--项目开发者的主页的URL -->
		<url />
		<!--项目开发者在项目中扮演的角色,角色元素描述了各种角色 -->
		<roles>
			<role>ProjectManager</role>
			<role>Architect</role>
		</roles>
		<!--项目开发者所属组织 -->
		<organization>demo</organization>
		<!--项目开发者所属组织的URL -->
		<organizationUrl>http://hi.baidu.com/banseon</organizationUrl>
		<!--项目开发者所在时区,-12到14范围内的整数。 -->
		<timezone>-5</timezone>
		<!-- 其他配置,键值对 -->
		<properties>
			<picUrl>http://tinyurl.com/prv4t</picUrl>
		</properties>
	</developer>
</developers>

contributors

<!--项目的其他贡献者列表 -->
<contributors>
	<!--项目的其他贡献者。参见developers/developer元素 -->
	<contributor>
		<name />
		<email />
		<url />
		<organization />
		<organizationUrl />
		<roles />
		<timezone />
		<properties />
	</contributor>
</contributors>

继承说明

dependencies中的jar是所有的子项目都会真实的依赖

dependencyManagement下的dependencies中的jar都仅是声明子项目中可以对dependencyManagement下的依赖进行信息的选择、继承、覆盖等。

plugins 下的 plugin 是真实使用的,而 pluginManagement 下的 plugins 下的 plugin 则仅仅是一种声明,子项目中可以对 pluginManagement 下的 plugin 进行信息的选择、继承、覆盖等。

 

子项目对properties中定义的变量如果与父项目中定义的同名会覆盖掉父项目中的定义使用子项目中的定义

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30417.html

(0)
上一篇 2023-11-16 07:15
下一篇 2023-11-26 16:15

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信