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 配置远程仓库。