Maven之pom.xml与setting.xml配置文件详解

.pom.xml详解

 

 

1.概述

 

 

pom中节点如下分布

<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.0modelVersion>

 

    

    <groupId>...groupId>

    <artifactId>...artifactId>

    <version>...version>

    <packaging>...packaging>

 

 

    

    <dependencies>...dependencies>

    <parent>...parent>

    <dependencyManagement>...dependencyManagement>

    <modules>...modules>

    <properties>...properties>

 

    

    <build>...build>

    <reporting>...reporting>

 

    

    <name>...name>

    <description>...description>

    <url>...url>

    <inceptionYear>...inceptionYear>

    <licenses>...licenses>

    <organization>...organization>

    <developers>...developers>

    <contributors>...contributors>

 

    

    <issueManagement>...issueManagement>

    <ciManagement>...ciManagement>

    <mailingLists>...mailingLists>

    <scm>...scm>

    <prerequisites>...prerequisites>

    <repositories>...repositories>

    <pluginRepositories>...pluginRepositories>

    <distributionManagement>...distributionManagement>

    <profiles>...profiles>

project>

 

 

 

2. 基本配置

 


modelVersionpom模型版本,maven23只能为4.0.0

groupId:组IDmaven用于定位

artifactId:在组中的唯一ID用于定位

version:项目版本

packaging:项目打包方式,有以下值:pom, jar, maven-plugin, ejb, war, ear, rar, par

 

 

 

 

3. 依赖配置

 

 

3.1 parent

 

用于确定父项目的坐标。

   <parent>

    <groupId>com.learnProgroupId>

    <artifactId>SIP-parentartifactId>

    <relativePath>relativePath>

    <version>0.0.1-SNAPSHOTversion>

parent>

 

groupId:父项目的构件标识符

artifactId:父项目的唯一标识符

relativePathMaven首先在当前项目的找父项目的pom,然后在文件系统的这个位置(relativePath),然后在本地仓库,再在远程仓库找。

version:父项目的版本


3.2 modules

 

有些maven项目会做成多模块的,这个标签用于指定当前项目所包含的所有模块。之后对这个项目进行的maven操作,会让所有子模块也进行相同操作。

 <modules>

   <module>com-a

   <module>com-b

   <module>com-c

 


3.3 properties

 

 

用于定义pom常量

<properties>

    <java.version>1.7java.version>

properties>

上面这个常量可以在pom文件的任意地方通过${java.version}来引用



3.4 dependencies

 

 

项目相关依赖配置,如果在父项目写的依赖,会被子项目引用,一般父项目会将子项目公用的依赖引入(将在之后详细讲解)

<dependencies> 

    <dependency>

            <groupId>junitgroupId>

            <artifactId>junitartifactId>

            <version>4.12version>

    dependency>

dependencies>

这边依赖和中央仓库中的一致,就可以引入对应的jar

 


3.5 dependencyManagement

 

 

配置写法同dependencies

<dependencyManagement>

    <dependencies>

    .....

    dependencies>

dependencyManagement>

在父模块中定义后,子模块不会直接使用对应依赖,但是在使用相同依赖的时候可以不加版本号:

 

父项目:

<dependencyManagement>

    <dependencies>

        <dependency>

            <groupId>junitgroupId>

            <artifactId>junitartifactId>

            <version>4.12version>

            <scope>testscope>

        dependency>

    dependencies>

dependencyManagement>

子项目:

<dependency>

    <groupId>junitgroupId>

    <artifactId>junitartifactId>

dependency>

 

这样的好处是,父项目统一了版本,而且子项目可以在需要的时候才引用对应的依赖

 

 

 

4. 构建配置


4.1 build

 


用于配置项目构建相关信息

 <build>    

        

    <sourceDirectory/>    

        

  <scriptSourceDirectory/>    

      

  <testSourceDirectory/>   

 

      

  <outputDirectory/>    

 

      

  <testOutputDirectory/>   

 

    

  <extensions>    

       

   <extension>    

        

    <groupId/>    

        

    <artifactId/>    

        

    <version/>    

   extension>    

  extensions>   

 

      

  <defaultGoal/>    

      

 

  <resources>    

       

   <resource>    

        

    <targetPath/>    

        

    <filtering/>    

        

    <directory/>    

        

    <includes/>    

        

    <excludes/>    

   resource>    

  resources>    

 

 

      

  <testResources>    

       

   <testResource>    

    <targetPath/><filtering/><directory/><includes/><excludes/>    

   testResource>    

  testResources>    

 

      

  <directory/> 

   

      

  <finalName/>  

  

      

  <filters/>    

      

 

  <pluginManagement>    

       

   <plugins>    

        

    <plugin>    

         

     <groupId/>    

         

     <artifactId/>    

         

     <version/>    

         

     <extensions/>    

         

     <executions>    

          

      <execution>    

           

       <id/>    

           

       <phase/>    

           

       <goals/>    

           

       <inherited/>    

           

       <configuration/>    

      execution>    

     executions>    

         

     <dependencies>    

          

      <dependency>    

       ......    

      dependency>    

     dependencies>         

         

     <inherited/>    

         

     <configuration/>    

    plugin>    

   plugins>    

  pluginManagement>    

 

 

      

  <plugins>    

       

   <plugin>    

    <groupId/><artifactId/><version/><extensions/>    

    <executions>    

     <execution>    

      <id/><phase/><goals/><inherited/><configuration/>    

     execution>    

    executions>    

    <dependencies>    

         

     <dependency>    

      ......    

     dependency>    

    dependencies>    

    <goals/><inherited/><configuration/>    

   plugin>    

  plugins>    

 build>

 

 

 

4.2 reporting

 

 

该元素描述使用报表插件产生报表的规范。当用户执行mvn site”,这些报表就会运行。 在页面导航栏能看到所有报表的链接。

<reporting>

      

  <excludeDefaults/>    

      

  <outputDirectory/>    

      

  <plugins>    

       

   <plugin>    

        

    <groupId/>    

        

    <artifactId/>    

        

    <version/>    

        

    <inherited/>    

        

    <configuration/>    

        

    <reportSets>    

         

     <reportSet>    

          

      <id/>    

          

      <configuration/>    

          

      <inherited/>    

          

      <reports/>    

     reportSet>    

    reportSets>    

   plugin>    

  plugins>    

 reporting>

 

 

 

5. 项目信息

 

 

 

name:给用户提供更为友好的项目名

description:项目描述,maven文档中保存

url:主页的URLmaven文档中保存

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

licenses:该元素描述了项目所有License列表。 应该只列出该项目的license列表,不要列出依赖项目的license列表。如果列出多个license,用户可以选择它们中的一个而不是接受所有license。(如下)

<license>

        

    <name>...name>     

        

    <url>....url>

        

    <distribution>repodistribution>     

        

    <comments>....comments>     

license> 

 

organization1.name组织名2.url组织主页url

developers:项目开发人员列表(如下)

contributors:项目其他贡献者列表,同developers

<developers>

    

    <developer>  

        

        <id>....id>  

        

        <name>...name>  

        

        <email>...email>  

        

        <url>...<url/>

        

        <roles>  

            <role>Java Devrole>  

            <role>Web UIrole>  

        roles> 

         

        <organization>sunorganization>  

        

        <organizationUrl>...organizationUrl>  

        

        <properties>

            

        properties> 

         

        <timezone>-5timezone>  

    developer>  

developers>  

 

 

 

6.环境设置

 


6.1 issueManagement

 

 

目的问题管理系统(Bugzilla, Jira, Scarab)的名称和URL

 

<issueManagement>

    <system>Bugzillasystem>

    <url>http://127.0.0.1/bugzilla/url>

issueManagement>

system:系统类型

url:路径

 

 

 


6.2 ciManagement

 

 

 

项目的持续集成信息

 <ciManagement>

    <system>continuumsystem>

    <url>http://127.0.0.1:8080/continuumurl>

    <notifiers>

      <notifier>

        <type>mailtype>

        <sendOnError>truesendOnError>

        <sendOnFailure>truesendOnFailure>

        <sendOnSuccess>falsesendOnSuccess>

        <sendOnWarning>falsesendOnWarning>

        <address>[email protected]address>

        <configuration>configuration>

      notifier>

    notifiers>

  ciManagement>

system:持续集成系统的名字

url:持续集成系统的URL

notifiers:构建完成时,需要通知的开发者/用户的配置项。包括被通知者信息和通知条件(错误,失败,成功,警告)

type:通知方式

sendOnError:错误时是否通知

sendOnFailure:失败时是否通知

sendOnSuccess:成功时是否通知

sendOnWarning:警告时是否通知

address:通知发送到的地址

configuration:扩展项

 

 

 

6.3 mailingLists

 

 

项目相关邮件列表信息

  <mailingLists>

    <mailingList>

      <name>User Listname>

      <subscribe>[email protected]subscribe>

      <unsubscribe>user-unsubscribe@127.0.0.1unsubscribe>

      <post>[email protected]post>

      <archive>http://127.0.0.1/user/archive>

      <otherArchives>

   <otherArchive>http://base.google.com/base/1/127.0.0.1otherArchive>

      otherArchives>

    mailingList>

    .....

  mailingLists>

 

subscribe, unsubscribe: 订阅邮件(取消订阅)的地址或链接,如果是邮件地址,创建文档时,mailto:链接会被自动创建

archive:浏览邮件信息的URL

post:接收邮件的地址

 


 

6.4 scm

 

 

 

允许你配置你的代码库,供Maven web站点和其它插件使用

  <scm>

    <connection>scm:svn:http://127.0.0.1/svn/my-projectconnection>

    <developerConnection>scm:svn:https://127.0.0.1/svn/my-projectdeveloperConnection>

    <tag>HEADtag>

    <url>http://127.0.0.1/websvn/my-projecturl>

  scm>

 

connection, developerConnection:这两个表示我们如何连接到maven的版本库。connection只提供读,developerConnection将提供写的请求

写法如:scm:[provider]:[provider_specific]

如果连接到CVS仓库,可以配置如下:scm:cvs:pserver:127.0.0.1:/cvs/root:my-project

tag:项目标签,默认HEAD

url:共有仓库路径

 

 


6.5 prerequisites

 

 

 

项目构建的前提

<prerequisites>

    <maven>2.0.6maven>

prerequisites>

 

 


6.6 repositories,pluginRepositories

 

 

 

依赖和扩展的远程仓库列表,同setting.xml配置中介绍的。

  <repositories>

    <repository>

      <releases>

        <enabled>falseenabled>

        <updatePolicy>alwaysupdatePolicy>

        <checksumPolicy>warnchecksumPolicy>

      releases>

      <snapshots>

        <enabled>trueenabled>

        <updatePolicy>neverupdatePolicy>

        <checksumPolicy>failchecksumPolicy>

      snapshots>

      <id>codehausSnapshotsid>

      <name>Codehaus Snapshotsname>

      <url>http://snapshots.maven.codehaus.org/maven2url>

      <layout>defaultlayout>

    repository>

  repositories>

  <pluginRepositories>

    ...

  pluginRepositories>

releases, snapshots:这是各种构件的策略,release或者snapshot。这两个集合,POM就可以根据独立仓库任意类型的依赖改变策略。如:一个人可能只激活下载snapshot用来开发。

enabletrue或者false,决定仓库是否对于各自的类型激活(release或者snapshot)

updatePolicy: 这个元素决定更新频率。maven将比较本地pom的时间戳(存储在仓库的maven数据文件中)和远程的.有以下选择: always, daily (默认), interval:X (x是代表分钟的整型)never.

checksumPolicy:当Maven向仓库部署文件的时候,它也部署了相应的校验和文件。可选的为:ignorefailwarn,或者不正确的校验和。

layout:在上面描述仓库的时候,提到他们有统一的布局。Maven 2有它仓库默认布局。然而,Maven 1.x有不同布局。使用这个元素来表明它是default还是legacy

 

 


 

6.7 distributionManagement

 

 

 

它管理的分布在整个构建过程生成的工件和支持文件

   <distributionManagement>

    ...

    <downloadUrl>http://mojo.codehaus.org/my-projectdownloadUrl>

    <status>deployedstatus>

  distributionManagement>

 

downloadUrl: 其他pom可以通过此url的仓库抓取组件

status:给出该构件在远程仓库的状态

none: 默认

converted: 将被早期Maven 2 POM转换过来

partner: 这个项目会从合作者仓库同步过来

deployed: Maven 23实例部署

verified: 被核实时正确的和最终的

 

 


 

6.8 Repository

 

 

指定Maven pom从远程下载控件到当前项目的位置和方式,如果snapshotRepository没有被定义则使用repository相关的配置

<distributionManagement>

    <repository>

      <uniqueVersion>falseuniqueVersion>

      <id>corp1id>

      <name>Corporate Repositoryname>

      <url>scp://repo/maven2url>

      <layout>defaultlayout>

    repository>

    <snapshotRepository>

      <uniqueVersion>trueuniqueVersion>

      <id>propSnapid>

      <name>Propellors Snapshotsname>

      <url>sftp://propellers.net/mavenurl>

      <layout>legacylayout>

    snapshotRepository>

    ...

  distributionManagement>

 

id, name:仓库的唯一标识

uniqueVersiontruefalse,指明控件部署的时候是否获取独立的版本号。

urlrepository元素的核心。指定位置和部署协议发布控件到仓库。

layout:布局,defaultlegacy

 

 

 

6.9 Site Distribution

 

 

多分布存储库,distributionManagement负责定义如何部署项目的网站和文档。

 

 <distributionManagement>

    ...

    <site>

      <id>mojo.websiteid>

      <name>Mojo Websitename>

      <url>scp://beaver.codehaus.org/home/projects/mojo/public_html/url>

    site>

    ...

  distributionManagement>

id, name, url: 这些元素与distributionManagement repository中的相同

 

 

 

6.10 Relocation

 

 

重新部署-项目不是静态的,是活的。他们需要被搬到更合适的地方。如:当你的下个成功的开源项目移到Apache下,重命名为org.apache:my-project:1.0对你项目更有好处。

 <distributionManagement>

    ...

    <relocation>

      <groupId>org.apachegroupId>

      <artifactId>my-projectartifactId>

      <version>1.0version>

      <message>We have moved the Project underApachemessage>

    relocation>

    ...

  distributionManagement>

 

 

 

6.11 profiles

 

 

profile可以让我们定义一系列的配置信息(插件等),然后指定其激活条件

profile的相关配置可以参考–setting.xml详解

 

 

 


 


二. setting.xml详解

 


1.文件概览




xml version="1.0" encoding="UTF-8"?>

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0

            http://maven.apache.org/xsd/settings-1.0.0.xsd">

    <localRepository/>

    <interactiveMode/>

    <offline/>

    <pluginGroups/>

    <servers/>

    <mirrors/>

    <proxies/>

    <profiles/>

    <activeProfiles/>

settings>

 


 

通过配置文件中的注释,我们可以看到,有两种配置此文件的方法

 


1.用户级别

${user.home}/.m2/settings.xml

可以通过指令 -s /path/to/user/settings.xml

 

2.全局级别

${maven.home}/conf/settings.xml.

可以通过指令 -gs /path/to/global/settings.xml

 

 

 


2.localRepository

 


localRepository用于构建系统的本地仓库的路径。

默认的值是${user.home}/.m2/repository

    Default: ${user.home}/.m2/repository

  <localRepository>/path/to/local/repolocalRepository>

 


3.interactiveMode

 


interactiveMode 用于决定maven是否在需要输出的时候提示你,默认true。如果是false,它将使用合理的默认值,或者基于一些设置。

 



4.offline

 


决定maven是否在构建的时候进行网络传输。

默认false,表示联网状态,true为取消联网。

在某些情况下设置为true是很有用的,比如jar无法从网上下载等

 




5.pluginGroups

 


pluginGroups 插件组

 

<pluginGroups>

    <pluginGroup>org.mortbay.jettypluginGroup>

 pluginGroups>

 

这样Maven可以使用简单的命令执行org.morbay.jetty:jetty-maven-plugin:run

 

mvn jetty run

 

我们同样可以在pom文件中看到相似的配置,只是在这配置了就起到全局的作用,而不用每个项目中pom配置jetty

 


6.proxies

 



此项用于设置http代理

有时候由于安全问题,需要配置http代理,通过代理服务才能正常访问外部仓库下载资源可以ping repo1.maven.org来访问中央仓库

telnet 218.14.227.197 3128 来查看代理地址以及端口是否畅通

 


<proxies>

    <proxy>

      <id>optionalid>

      <active>trueactive>

      <protocol>httpprotocol>

      <username>proxyuserusername>

      <password>proxypasspassword>

      <host>proxy.host.nethost>

      <port>80port>

     <nonProxyHosts>local.net|some.host.comnonProxyHosts>

    proxy>

  proxies>

 


idproxy的唯一标识,用来区别proxy元素。

active:表示是否激活代理,如果配置多个,默认是第一个生效

usernamepassword:提供连接代理服务器时的认证。

hostport:主机地址,端口号

nonProxyHosts:用来表示哪些主机名不需要代理,可以用|来分

割多个,此外也支持通配符,

如:*.goole.com表示所有以goole.com结尾的都不需要通过代理

 



7.servers


 

这是一个认证配置的列表,根据系统中使用的server-id控制。认证配置在maven连接到远程服务时使用。

 

<servers>

    

    <server>

          <id>deploymentRepoid>

          <username>repouserusername>

          <password>repopwdpassword>

        server>

 

        

        <server>

          <id>siteServerid>

          <privateKey>/path/to/private/keyprivateKey>

          <passphrase>可空passphrase>

        server>

servers>

 

 


8.mirrors

 



指定镜像仓库位置用于从远程仓库下载资源

<mirrors>

    <mirror>

      <id>mirrorIdid>

      <mirrorOf>repositoryIdmirrorOf>

      <name>Human Readable Name for this Mirror.name>

      <url>http://my.repository.com/repo/pathurl>

    mirror>

mirrors>

 

id:用于继承和直接查找,唯一

mirrorOf:镜像所包含的仓库的Id

name:唯一标识,用于区分镜像站

url:镜像路径

 


9.profiles

 



1. settings.xml中时意味着该profile是全局的,所以只能配置范围宽泛一点配置信息,比如远程仓库等。而一些比较细致一点的需要定义在项目的pom.xml中。

 

2.profile可以让我们定义一系列的配置信息,然后指定其激活条件。

根据每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置。

例子:通过profile定义jdk1.5以上使用一套配置,jdk1.5以下使用另外一套配置;或者通过操作系统来使用不同的配置信息。

 

3.settings.xml中的信息有repositoriespluginRepositoriesproperties。定义在properties的值可以在pom.xml中使用。

下面的例子是从官网翻译的,大家有疑问还可以去官网查看

 


Activation

 


<profiles>

    <profile>

              <id>testid>

              <activation>

                 <activeByDefault>falseactiveByDefault>

                 <jdk>1.5jdk>

                 <os>

                     <name>Windows XPname>

                     <family>Windowsfamily>

                     <arch>x86arch>

                     <version>5.1.2600version>

                 os>

                 <property>

                     <name>mavenVersionname>

                     <value>2.0.3value>

                 property>

                 <file>

                <exists>${basedir}/file2.propertiesexists>

               <missing>${basedir}/file1.propertiesmissing>

                file>

             activation>

         profile>

profiles>

 

jdk:检测到对应jdk版本就激活

os:针对不同操作系统

property:当maven检测到propertypom中如${name}这样的)profile将被激活

file:如果存在文件,激活,不存在文件激活

通过以下命令查看哪些profile将生效

 

mvn help:active-profiles

 

 

 

 


properites

 


Maven的属性是值占位符,就像Ant中的一样。如果X是一个属性的话,在POM中可以使用${X}来进行任意地方的访问。他们来自于五种不同的风格,所有都可以从settings.xml文件中访问到。

 

1.env.xenv.”前缀会返回当前的环境变量。如${env.PATH}就是使用了$path环境变量(windosws中的%PATH%)。

 

2.project.x:一个点.”分割的路径,在POM中就是相关的元素的值。例如:1.0就可以通过${project.version}来访问。

 

3.settings.x:一个点.”分割的路径,在settings.xml中就是相对应的元素的值,例如:false就可以通过${settings.offline}来访问。

 

4.Java系统属性:通过java.lang.System.getProperties()来访问的属性都可以像POM中的属性一样访问,例如:${java.home}

 

5.x:被或者外部文件定义的属性,值可以这样访问${someVar}

 

  <profiles>

    <profile>

      ...

      <properties>

        <user.install>${user.home}/our-projectuser.install>

      properties>

      ...

    profile>

  profiles>

 

上面这个profile如果被激活,那么在pom${user.install}就可以被访问了。

 


Repositories

 


Repositories是远程项目集合maven用来移植到本地仓库用于构建系统。如果来自本地仓库,Maven调用它的插件和依赖关系。不同的远程仓库可能包含不同的项目,当profile被激活,他们就会需找匹配的release或者snapshot构件。

<profiles>

    <profile>

      ...

      <repositories>

        <repository>

          <id>codehausSnapshotsid>

          <name>Codehaus Snapshotsname>

          <releases>

            <enabled>falseenabled>

            <updatePolicy>alwaysupdatePolicy>

            <checksumPolicy>warnchecksumPolicy>

          releases>

          <snapshots>

            <enabled>trueenabled>

            <updatePolicy>neverupdatePolicy>

            <checksumPolicy>failchecksumPolicy>

          snapshots>

          <url>http://snapshots.maven.codehaus.org/maven2url>

          <layout>defaultlayout>

        repository>

      repositories>

      <pluginRepositories>

        ...

      pluginRepositories>

      ...

    profile>

  profiles>

 

1.releasessnapshots:这是各种构件的策略,release或者snapshot。这两个集合,POM就可以根据独立仓库任意类型的依赖改变策略。如:一个人可能只激活下载snapshot用来开发。

2.enabletrue或者false,决定仓库是否对于各自的类型激活(release或者snapshot)

 

3.updatePolicy:这个元素决定更新频率。maven将比较本地pom的时间戳(存储在仓库的maven数据文件中)和远程的.有以下选择: always, daily (默认), interval:X (x是代表分钟的整型)never.

 

4.checksumPolicy:当Maven向仓库部署文件的时候,它也部署了相应的校验和文件。可选的为:ignorefailwarn,或者不正确的校验和。

 

5.layout:在上面描述仓库的时候,提到他们有统一的布局。Maven 2有它仓库默认布局。然而,Maven 1.x有不同布局。使用这个元素来表明它是default还是legacy

 

 


10. activeProfiles

 

 


<activeProfiles>

    <activeProfile>alwaysActiveProfileactiveProfile>

    <activeProfile>anotherAlwaysActiveProfileactiveProfile>

activeProfiles>

 

每个activeProfile元素对应一个profile id的值,任何profile id被定义到activeProfileprofile将被激活。

 

 


参考文档:

http://blog.csdn.net/oDeviloo/article/details/52050277

http://blog.csdn.net/odeviloo/article/details/51999878


你可能感兴趣的:(Maven之pom.xml与setting.xml配置文件详解)