pom.xml ,maven的核心配置文件,Project Object Model(项目对象模型),用于描述整个maven项目,也称为Maven 描述文件
<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>com.nzs</groupId>
<artifactId>nzs</artifactId>
<packaging>war</packaging>
<version>1.0</version>
<build/>
</project>
以上为maven 的基础配置:
1.modelVersion
指定当前Maven模型的版本号,对于Maven2和Maven3而言只能为4.0.0 或之上。
2.groupId
公司或组织名,并且配置时生成路径也由此生成。
3.artifactId
maven 构建的项目名
4.packing
项目打包的类型,可以是jar、war、rar、ear、pom,默认为jar
5.version
版本号
其中groupId、artifactId、version、packaging这四项组成项目唯一坐标,一般情况下,前三项就可以组成项目的唯一坐标。另外
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
是一些有关项目更详尽的描述,可选填。
- dependencies 和dependency
前者包含后者,Maven的一个重要作用就是统一管理jar包。项目依赖的一些jar包,在Maven中被称为dependency.
Maven 工程首先会从本地仓库中获取jar包,当无法获取jar包时,本地仓库会从远程仓库(中央仓库)中下载jar包,并放入本地仓库以备使用。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<type>jar</type>
<scope>test</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.aliyun.mns</groupId>
<artifactId>aliyun-sdk-mns</artifactId>
<version>1.1.8</version>
<!--<classifier>jar-with-dependencies</classifier>-->
</dependency>
<dependency>
<groupId>com.alibaba.china.shared</groupId>
<artifactId>alibaba.apollo.webx</artifactId>
<version>2.5.0</version>
<exclusions>
<exclusion>
<artifactId>org.slf4j.slf4j-api</artifactId>
<groupId>com.alibaba.external</groupId>
</exclusion>
....
</exclusions>
......
</dependencies>
type:默认为jar,常见类型为:jar、ejb-client、test-jar…可设置plugins 中的值为true后再增加新的类型。
scope:用来指定当前包的依赖范围。compile(default),provided,runtime,test,system
optional:设置依赖是否可选,默认为false,即子项目默认都继承;为true则子项目必须显式地引入,与dependencyManagement里定义的依赖类似。
exclusions:如果x需要A,A包含B依赖,则x可以声明不要B依赖,只要在exclusions中声明exclusion.
exclusion:将依赖从依赖树中删除,如上,alibaba.apollo.webx不想使用com.alibaba.external,需要将它排除。
classifier:分类器。同样的代码可以使用分类器生成不同的jar构件。他们具有不同的groupId:artifactId:version 组合。一般会生成名为artifactId-version-classifier的jar包。在实际环境中,可以为不同的编译环境,不同目标平台使用不同分类。分类器常用于打包构件的源码,JavaDoc或者二进制集合。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.1.2.RELEASE</spring.version>
<motan.version>0.2.2</motan.version>
</properties>
properties 用来定义一些配置属性,如project.build.sourceEncoding(项目构建源码编码方式)可设置为UTF-8,防止中文乱码,也可定义相关构件版本号,以便日后统一升级。如上定义了spring.version,在dependency中就可以这样使用:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
.....
properties 是maven的属性,是值的占位符,类似EL,如${x} ,可用于pom文件任何赋值的位置,有以下分类。
1.env.x:操作系统环境变量,如${env.PATH}
2.project.x:pom 文件中的属性如《project>《version>1.0《/version><\project>,引用方式${project.version}
3.setting.x :setting.xml中的属性,
4.Java System Properties:java.lang.System.getProperties()中的属性,如java.home,引用方式${java.home}
5.自定义:如上面的spring.version
<!--构建-->
<build>
<!--<defaultGoal>install</defaultGoal>-->
<!--<directory>${basedir}/target</directory>-->
<!--<finalName>${artifactId}-${version}</finalName>-->
<!--<filters>-->
<!--<filter>filters/filter1.properties</filter>-->
<!--</filters>-->
<finalName>nzs</finalName>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
<!--设置自动替换-->
<resource>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>jdbc.properties</include>
<include>nzs.properties</include>
</includes>
<!--也可以用排除标签-->
<!--<excludes></excludes>-->
<!--开启过滤-->
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<!-- 处理资源文件,实现针对不同环境传入不同属性值,以便更灵活地构建 --> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<!-- 编译插件 --> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<!--源代码编译版本-->
<source>1.8</source>
<!--目标平台编译版本-->
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<!--生成source源代码包,提供项目自动将源代码打包并发布的功能--> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<!--帮助分析项目依赖--> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
</plugin>
<plugin>
<!--Maven 2/3测试插件,跳过测试用例插件--> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.15</version>
<configuration>
<skip>true</skip>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
<plugin>
<!--单元测试整体覆盖率以及分支覆盖率统计插件--> <groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.5.2</version>
<configuration>
<instrumentation>
<ignores>
<ignore>com.example.boringcode.*</ignore>
</ignores>
<excludes>
<exclude>**/*Test.class</exclude>
</excludes>
</instrumentation>
<check/>
</configuration>
<executions>
<execution>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<!--自动化项目版本发布--> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.4.1</version>
</plugin>
<plugin>
<!--代码格式检查--> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>2.10</version>
</plugin>
<plugin>
<!--发布插件-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.7</version>
</plugin>
</plugins>
</build>
build 表示与构建相关配置
首先解释一下Maven项目的目录结构
1.main目录下是项目的主要代码,test目录下存放测试相关代码
2.编译输出后的代码会放在target目录下
3.src/main/java 下存放Java代码,src/main/resources下存放配置文件
4.webapp下存放web 应用相关代码
5.pom.xml Maven 项目的配置文件
下面是build中的解释。
1.defaultGoal:执行build任务时,如果没有指定目标则使用该默认值。如上:在命令行执行mvn,则相当于执行 mvn install
2.directory:build目标文件的存放目录,默认${basedir}/target
3.finalName:build目标文件的文件名,默认${artifactId}-${version}
4.filter:定义properties 文件,包含一个properties列表,该类表会应用到支持filter 的resources中。定义在filterz中的”name=value”的会在build时替换并应用到resources中。Maven的默认filter文件夹是${basedir}/src/main/filters/.
resources 的一些配置
1.resources:resource元素列表
2.targetPath:指定build后的resource存放的文件夹,通常默认为basedir。一般被打包在jar中的resources的目标路径为META-INF
3.filtering:true/false:自动替换是否激活
4.directory:定义resource所在文件夹,默认${basedir}/src/main/resources
5.includes:指定包含文件的patterns,符合样式且在directory 目录下的文件将会包含进project的资源文件
6.excludes:指定哪些文件被忽略,如果一个文件同时符合includes和excludes,则exludes生效
7.testResources:定义和resource类似,但只在test时使用,默认的test resource 文件夹路径是${basedir}/src/test/resources,test resource 不被部署。
plugin的一些属性:
除了groupId、artifactId、version标准坐标,plugin 还需要如下属性:
1.extensions:true/false,是否加载plugin的extensions.默认为false
2.inherited:true/false.这个plugin是否应用到该pom的子POM,默认为true.
3.configuration:配置该plugin期望得到的properies.如上面的例子。
一些常用插件的用途见这里
<!--编译的配置文件-->
<profiles>
<profile>
<id>product</id>
<build>
<filters>
<filter>${basedir}/src/main/filters/jdbc-product.properties</filter>
<filter>${basedir}/src/main/filters/nzs-product.properties</filter>
</filters>
</build>
</profile>
<profile>
<id>test</id>
<build>
<filters>
<filter>${basedir}/src/main/filters/jdbc-test.properties</filter>
<filter>${basedir}/src/main/filters/nzs-test.properties</filter>
</filters>
</build>
</profile>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<filters>
<filter>${basedir}/src/main/filters/jdbc-test.properties</filter>
<filter>${basedir}/src/main/filters/nzs-test.properties</filter>
</filters>
</build>
</profile>
</profiles>
profiles:pom4.0 的新特性,可以根据environment来修改设置,可填写内容如下:
<profiles>
<profile>
<id>test</id>
<activation>...</activation>
<build>...</build>
<modules>...</modules>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<dependencies>...</dependencies>
<reporting>...</reporting>
<dependencyManagement>...</dependencyManagement>
<distributionManagement>...</distributionManagement>
</profile>
</profiles>
activation 当前profile 被激活的环境条件,给出任何一个条件即可激活。如下:
<profiles>
<profile>
<id>test</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.5</jdk>
<os>
<name>Windows XP</name>
<family>Windows</family>
<arch>x86</arch>
<version>5.1.2600</version>
</os>
<property>
<name>sparrow-type</name>
<value>African</value>
</property>
<file>
<exists>${basedir}/file2.properties</exists>
<missing>${basedir}/file1.properties</missing>
</file>
</activation>
...
</profile>
</profiles>
</project>
激活profile的方法有多个:
1.setting.xml 的activeProfile 元素明确指定激活的profile的ID
2.命令行:-P flag 参数
查看某个build 会激活的profile 列表可以用:mvn help:active-profiles
<!--远程仓库-->
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>bintray</name>
<url>http://jcenter.bintray.com</url>
</repository>
</repositories>
repositories 配置远程仓库。