首页 > 代码库 > maven配置文件解析

maven配置文件解析

maven2配置文件主要分为settings.xml与pom.xml两种,下面将逐一介绍。 
===================================settings.xml===================================================================
 settings.xml对于maven来说相当于全局性的配置,用于所有的项目。在maven2中存在两个 settings.xml,一个位于maven2的安装目录conf下面,作为全局性配置。对于团队设置,保持一致的定义是关键,所以 maven2/conf下面的settings.xml就作为团队共同的配置文件。保证所有的团队成员都拥有相同的配置。当然对于每个成员,都需要特殊的 自定义设置,如用户信息,所以另外一个settings.xml就作为本地配置。默认的位置为:${user.dir} /.m2/settings.xml目录中(${user.dir} 指windows 中的用户目录)。
    settings.xml基本结构如下:
xml 代码
 2 <settings xmlns="http://maven.apache.org/POM/4.0.0"  
 3           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
 4           xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  
 5                                http://maven.apache.org/xsd/settings-1.0.0.xsd">  
 6   <localRepository/>  
 7   <interactiveMode/>  
 8   <usePluginRegistry/>  
 9   <offline/>  
10   <pluginGroups/>  
11   <servers/>  
12   <mirrors/>  
13   <proxies/>  
14   <profiles/>  
15   <activeProfiles/>  
16 </settings>  
简单介绍一下几个主要的配置因素:
localRepository:表示本地库的保存位置,也就是maven2主要的jar保存位置,默认在${user.dir}/.m2/repository,如果需要另外设置,就换成其他的路径。
offline:如果不想每次编译,都去查找远程中心库,那就设置为true。当然前提是你已经下载了必须的依赖包。
Servers:在POM中的 distributionManagement元素定义了开发库。然而,特定的username和pwd不能使用于pom.xml,所以通过此配置来保存server信息
xml 代码
 2 <servers>  
 3    <server>  
 4      <id>server001</id>  
 5      <username>my_login</username>  
 6      <password>my_password</password>  
 7      <privateKey>${usr.home}/.ssh/id_dsa</privateKey>  
 8      <passphrase>some_passphrase</passphrase>  
 9      <filePermissions>664</filePermissions>  
10      <directoryPermissions>775</directoryPermissions>  
11      <configuration></configuration>  
12    </server>  
13  </servers>   
  • id:server 的id,用于匹配distributionManagement库id,比较重要。
  • username, password:用于登陆此服务器的用户名和密码
  • privateKey, passphrase:设置private key,以及passphrase
  • filePermissions, directoryPermissions:当库文件或者目录创建后,需要使用权限进行访问。参照unix文件许可,如664和775
Mirrors:表示镜像库,指定库的镜像,用于增加其他库
xml 代码
1  <mirrors>  
2    <mirror>  
3      <id>planetmirror.com</id>  
4      <name>PlanetMirror Australia</name>  
5      <url>http://downloads.planetmirror.com/pub/maven2</url>  
6      <mirrorOf>central</mirrorOf>  
7    </mirror>  
8  </mirrors>  
  • id,name:唯一的标志,用于区别镜像
  • url:镜像的url
  • mirrorOf:此镜像指向的服务id
Proxies:此设置,主要用于无法直接访问中心的库用户配置。
xml 代码
 1  <proxies>  
 2    <proxy>  
 3      <id>myproxy</id>  
 4      <active>true</active>  
 5      <protocol>http</protocol>  
 6      <host>proxy.somewhere.com</host>  
 7      <port>8080</port>  
 8      <username>proxyuser</username>  
 9      <password>somepassword</password>  
10      <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>  
11    </proxy>  
12  </proxies>  
  • id:代理的标志
  • active:是否激活代理
  • protocol, host, port:protocol://host:port 代理
  • username, password:用户名和密码
  • nonProxyHosts: 不需要代理的host
Profiles:类似于pom.xml中的profile元素,主要包括activation,repositories,pluginRepositories 和properties元素,  刚开始接触的时候,可能会比较迷惑,其实这是maven2中比较强大的功能。从字面上来说,就是个性配置。单独定义profile后,并不会生效,需要通过满足条件来激活。
repositories 和pluginRepositories: 定义其他开发库和插件开发库。对于团队来说,肯定有自己的开发库。可以通过此配置来定义。如下的配置,定义了本地开发库,用于release 发布。
xml 代码
 1  <repositories>  
 2         <repository>  
 3           <id>repo-local</id>  
 4        <name>Internal 开发库</name>  
 5        <url>http://192.168.0.2:8082/repo-local</url>  
 6           <releases>  
 7             <enabled>true</enabled>  
 8             <updatePolicy>never</updatePolicy>  
 9             <checksumPolicy>warn</checksumPolicy>  
10           </releases>  
11           <snapshots>  
12             <enabled>false</enabled>  
13           </snapshots>  
14           <layout>default</layout>  
15         </repository>  
16       </repositories>  
17       <pluginRepositories>  
18     <pluginRepository>  
19     <id>repo-local</id>  
20     <name>Internal 开发库</name>  
21     <url>http://192.168.0.2:8082/repo-local</url>  
22     <releases>  
23             <enabled>true</enabled>  
24             <updatePolicy>never</updatePolicy>  
25             <checksumPolicy>warn</checksumPolicy>  
26     </releases>  
27     <snapshots>  
28     <enabled>false</enabled>  
29     </snapshots>  
30     <layout>default</layout>  
31     </pluginRepository>  
32     </pluginRepositories>  
releases, snapshots:每个产品的版本的Release或者snapshot(注:release和snapshot的区别,release一般是比较稳定的版本,而snapshot基本上不稳定,只是作为快照)

properties:maven 的properties作为placeholder值,如ant的properties。包括以下的5种类型值:
  1. env.X,返回当前的环境变量
  2. project.x:返回pom中定义的元素值,如project.version
  3. settings.x:返回settings.xml中定义的元素
  4. java 系统属性:所有经过java.lang.System.getProperties()返回的值
  5. x:用户自己设定的值
Activation: 用于激活此profile
xml 代码
 1  <activation>  
 2         <activeByDefault>false</activeByDefault>  
 3         <jdk>1.5</jdk>  
 4         <os>  
 5           <name>Windows XP</name>  
 6           <family>Windows</family>  
 7           <arch>x86</arch>  
 8           <version>5.1.2600</version>  
 9         </os>  
10         <property>  
11           <name>mavenVersion</name>  
12           <value>2.0.3</value>  
13         </property>  
14         <file>  
15           <exists>${basedir}/file2.properties</exists>  
16           <missing>${basedir}/file1.properties</missing>  
17         </file>  
18  </activation>  
  • jdk:如果匹配指定的jdk版本,将会激活
  • os:操作系统
  • property:如果maven能检测到相应的属性
  • file: 用于判断文件是否存在或者不存在
除了使用activation来激活profile,同样可以通过activeProfiles来激活
Active Profiles:表示激活的profile,通过profile id来指定。
xml 代码
1   <activeProfiles>  
2      <activeProfile>env-test</activeProfile> 指定的profile id  
3   </activeProfiles> 
===================================pom.xml===================================================================
什么是pom:pom作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他所有的项目相关因素。

xml 代码
 1 <project>  
 2   <modelVersion>4.0.0modelVersion>  
 3   
 4     
 5   <groupId>...<groupId>  
 6   <artifactId>...<artifactId>  
 7   <version>...<version>  
 8   <packaging>...<packaging>  
 9   <dependencies>...<dependencies>  
10   <parent>...<parent>  
11   <dependencyManagement>...<dependencyManagement>  
12   <modules>...<modules>  
13   <properties>...<properties>  
14   
15     
16   <build>...<build>  
17   <reporting>...<reporting>  
18   
19     
20   <name>...<name>  
21   <description>...<description>  
22   <url>...<url>  
23   <inceptionYear>...<inceptionYear>  
24   <licenses>...<licenses>  
25   <organization>...<organization>  
26   <developers>...<developers>  
27   <contributors>...contributors>  
28   
29     
30   <issueManagement>...<issueManagement>  
31   <ciManagement>...<ciManagement>  
32   <mailingLists>...<mailingLists>  
33   <scm>...<scm>  
34   <prerequisites>...<prerequisites>  
35   <repositories>...<repositories>  
36   <pluginRepositories>...<pluginRepositories>  
37   <distributionManagement>...<distributionManagement>  
38   <profiles>...<profiles>  
39 <project>  
基本内容:
    POM包括了所有的项目信息。定义了最小的maven2元素,允许groupId,artifactId,version。所有需要的元素
  • groupId:项目或者组织的唯一标志,并且配置时生成的路径也是由此生成,如org.codehaus.mojo生成的相对路径为:/org/codehaus/mojo
  • artifactId: 项目的通用名称
  • version:项目的版本
  • packaging: 打包的机制,如pom, jar, maven-plugin, ejb, war, ear, rar, par
  • classifier: 分类
POM关系:要为依赖,继承,合成
 依赖关系:

xml 代码
 
 1 <dependencies>  
 2     <dependency>  
 3       <groupId>junitgroupId>  
 4       <artifactId>junitartifactId>  
 5       <version>4.0version>  
 6       <type>jartype>  
 7       <scope>testscope>  
 8       <optional>trueoptional>  
 9     <dependency>  
10     ...  
11   <dependencies>  
  • groupId, artifactId, version:描述了依赖的项目唯一标志
可以通过以下方式进行安装:
  • 使用以下的命令安装:
  • mvn install:install-file –Dfile=non-maven-proj.jar –DgroupId=some.group –DartifactId=non-maven-proj –Dversion=1
  • 创建自己的库,并配置,使用deploy:deploy-file
  • 设置此依赖范围为system,定义一个系统路径。不提倡。
  • type:相应的依赖产品包形式,如jar,war
  • scope:用于限制相应的依赖范围,包括以下的几种变量:
  • compile :默认范围,用于编译
  • provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath
  • runtime:在执行时,需要使用
  • test:用于test任务时使用
  • system:需要外在提供相应得元素。通过systemPath来取得
  • systemPath: 仅用于范围为system。提供相应的路径
  • optional: 标注可选,当项目自身也是依赖时。用于连续依赖时使用
   独占性:外在告诉maven你只包括指定的项目,不包括相关的依赖。此因素主要用于解决版本冲突问题
 
xml 代码
 1  <dependencies>  
 2     <dependency>  
 3       <groupId>org.apache.maven<groupId>  
 4       <artifactId>maven-embedder<artifactId>  
 5       <version>2.0<version>  
 6       <exclusions>  
 7         <exclusion>  
 8           <groupId>org.apache.maven<groupId>  
 9           <artifactId>maven-core<artifactId>  
10         <exclusion>  
11       <exclusions>  
12     <dependency> 
表示项目maven-embedder需要项目maven-core,但我们不想引用maven-core

继承关系:另一个强大的变化,maven带来的是项目继承。主要的设置:
定义父项目
xml 代码
<project>  
  <modelVersion>4.0.0<modelVersion>  
  <groupId>org.codehaus.mojo<groupId>  
  <artifactId>my-parent<artifactId>  
  <version>2.0<version>  
  <packaging>pom<packaging>  
<project> 
    packaging 类型,需要pom用于parent和合成多个项目。我们需要增加相应的值给父pom,用于子项目继承。主要的元素如下:
  • 依赖型
  • 开发者和合作者
  • 插件列表
  • 报表列表
  • 插件执行使用相应的匹配ids
  • 插件配置
  • 子项目配置
xml 代码
 1 <project>  
 2   <modelVersion>4.0.0<modelVersion>  
 3   <parent>  
 4     <groupId>org.codehaus.mojo<groupId>  
 5     <artifactId>my-parent<artifactId>  
 6     <version>2.0<version>  
 7     <relativePath>../my-parent<relativePath>  
 8   <parent>  
 9   <artifactId>my-project<artifactId>  
10 <project> 
relativePath可以不需要,但是用于指明parent的目录,用于快速查询。

dependencyManagement:用于父项目配置共同的依赖关系,主要配置依赖包相同因素,如版本,scope。

合成(或者多个模块)
    一个项目有多个模块,也叫做多重模块,或者合成项目。
如下的定义:
xml 代码
 1 <project>  
 2   <modelVersion>4.0.0<modelVersion>  
 3   <groupId>org.codehaus.mojo<groupId>  
 4   <artifactId>my-parent<artifactId>  
 5   <version>2.0<version>  
 6   <modules>  
 7     <module>my-project1<module>  
 8     <module>my-project2<module>  
 9   <modules>  
10 <project> 
build 设置
    主要用于编译设置,包括两个主要的元素,build和report
  build
    主要分为两部分,基本元素和扩展元素集合
注意:包括项目build和profile build
xml 代码
1  <project>   
2   <build>...build>  
3   <profiles>  
4     <profile>    
5       <build>...build>  
6     <profile>  
7   <profiles>  
8 <project> 
基本元素
xml 代码
1 <build>  
2   <defaultGoal>install<defaultGoal>  
3   <directory>${basedir}/target<directory>  
4   <finalName>${artifactId}-${version}<finalName>  
5   <filters>  
6     <filter>filters/filter1.properties<filter>  
7   <filters>  
8   ...  
9 <build> 
  • defaultGoal: 定义默认的目标或者阶段。如install
  • directory: 编译输出的目录
  • finalName: 生成最后的文件的样式
  • filter: 定义过滤,用于替换相应的属性文件,使用maven定义的属性。设置所有placehold的值
资源(resources)你项目中需要指定的资源。如spring配置文件,log4j.properties
xml 代码
 
 1 <project>  
 2   <build>  
 3     ...  
 4     <resources>  
 5       <resource>  
 6         <targetPath>META-INF/plexus<targetPath>  
 7         <filtering>false<filtering>  
 8         <directory>${basedir}/src/main/plexus<directory>  
 9         <includes>  
10           <include>configuration.xml<include>  
11         <includes>  
12         <excludes>  
13           <exclude>**/*.properties<exclude>  
14         <excludes>  
15       <resource>  
16     <resources>  
17     <testResources>  
18       ...  
19     <testResources>  
20     ...  
21   <build>  
22 <project>  
  • resources: resource的列表,用于包括所有的资源
  • targetPath: 指定目标路径,用于放置资源,用于build
  • filtering: 是否替换资源中的属性placehold
  • directory: 资源所在的位置
  • includes: 样式,包括那些资源
  • excludes: 排除的资源
  • testResources: 测试资源列表
插件: 在build时,执行的插件,比较有用的部分,如使用jdk 5.0编译等等
xml 代码
 
 1 <project>  
 2   <build>  
 3     ...  
 4     <plugins>  
 5       <plugin>  
 6         <groupId>org.apache.maven.plugins<groupId>  
 7         <artifactId>maven-jar-plugin<artifactId>  
 8         <version>2.0<version>  
 9         <extensions>false<extensions>  
10         <inherited>true<inherited>  
11         <configuration>  
12           <classifier>test<classifier>  
13         <configuration>  
14         <dependencies>...<dependencies>  
15         <executions>...<executions>  
16       <plugin>  
17     <plugins>  
18   <build>  
19 <project> 
  • extensions: true or false,是否装载插件扩展。默认false
  • inherited: true or false,是否此插件配置将会应用于poms,那些继承于此的项目
  • configuration: 指定插件配置
  • dependencies: 插件需要依赖的包
  • executions: 用于配置execution目标,一个插件可以有多个目标。
如下:
   
xml 代码
 2 <plugin>  
 3         <artifactId>maven-antrun-plugin<artifactId>  
 4           <executions>  
 5           <execution>  
 6             <id>echodir<id>  
 7             <goals>  
 8               <goal>run<goal>  
 9             <goals>  
10             <phase>verify<phase>  
11             <inherited>falsein<herited>  
12             <configuration>  
13               <tasks>  
14                 <echo>Build Dir: ${project.build.directory}<echo>  
15               <tasks>  
16             <configuration>  
17           <execution>  
18         <executions>  
19       <plugin> 
  说明:
  • id:规定execution 的唯一标志
  • goals: 表示目标
  • phase: 表示阶段,目标将会在什么阶段执行
  • inherited: 和上面的元素一样,设置false maven将会拒绝执行继承给子插件
  • configuration: 表示此执行的配置属性

插件管理:pluginManagement:插件管理以同样的方式包括插件元素,用于在特定的项目中配置。所有继承于此项目的子项目都能使用。主要定义插件的共同元素

扩展元素集合主要包括以下的元素:
Directories
用于设置各种目录结构,如下:
xml 代码
1 <build>  
2     <sourceDirectory>${basedir}/src/main/java<sourceDirectory>  
3     <scriptSourceDirectory>${basedir}/src/main/<scriptsscriptSourceDirectory>  
4     <testSourceDirectory>${basedir}/src/test/java<testSourceDirectory>  
5     <outputDirectory>${basedir}/target/classes<outputDirectory>  
6     <testOutputDirectory>${basedir}/target/test-classes<testOutputDirectory>  
7     ...  
8   <build>  

Extensions:表示需要扩展的插件,必须包括进相应的build路径。
xml 代码
 1 <project>  
 2   <build>  
 3     ...  
 4     <extensions>  
 5       <extension>  
 6         <groupId>org.apache.maven.wagon<groupId>  
 7         <artifactId>wagon-ftp<artifactId>  
 8         <version>1.0-alpha-3<version>  
 9       <extension>  
10     <extensions>  
11     ...  
12   <build>  
13 <project>  
Reporting:    用于在site阶段输出报表。特定的maven 插件能输出相应的定制和配置报表。
 
xml 代码
 
 1 <reporting>  
 2     <plugins>  
 3       <plugin>  
 4         <outputDirectory>${basedir}/target/site<outputDirectory>  
 5         <artifactId>maven-project-info-reports-plugin<artifactId>  
 6         <reportSets>  
 7           <reportSet><reportSet>  
 8         <reportSets>  
 9       <plugin>  
10     <plugins>  
11   <reporting>  
Report Sets:用于配置不同的目标,应用于不同的报表
xml 代码
 
 1 <reporting>  
 2     <plugins>  
 3       <plugin>  
 4         ...  
 5         <reportSets>  
 6           <reportSet>  
 7             <id>sunlink<id>  
 8             <reports>  
 9               <report>javadoc<report>  
10             <reports>  
11             <inherited>truein<herited>  
12             <configuration>  
13               <links>  
14                 <link>http://java.sun.com/j2se/1.5.0/docs/api/<link>  
15               <links>  
16             <configuration>  
17           <reportSet>  
18         <reportSets>  
19       <plugin>  
20     <plugins>  
21   <reporting>