Maven 的思想就是把每一个项目都当成一个对象来对待,每个项目都对应一个pom.xml文件,该文件描述了此项目的继承信息、依赖信息、项目对象名、版本等信息。而Maven 通过读取pom.xml文件,来处理各项目之间的协作关系。所以熟悉pom.xml 文件对使用Maven 特别重要。
介绍Maven 的文章很多,谈的也比较深入,作为一个基础使用者,我可能没太多精力去关注设计理念方面的东西,只想谈谈自己的粗浅认识。就拿pom.xml文件来说,里面最重要的配置有依赖配置(<dependencies>)与插件配置(<plugins>),前者是我们自身整个系统的一部分,后者是为我们开发系统做支撑的一系列现成资源(如编译插件、服务器插件、日志插件等),它们本身其实也是一个个Maven 项目,但与普通Maven 项目相比,它们是为了完成特定的开发或运行过程中的的任务,并不与我们的系统逻辑直接相关。
对于依赖项(<dependency>),groupId、artifactId、version 就能唯一确定具体依赖的项目,而对于插件(<plugin>),通常还需具体的配置信息,这些插件所需的配置信息通常由元素<configuration>元素指定。不同的插件,应该如何配置其所需信息,这是个重点。
一、对pom.xml 中所有元素进行基础了解。
1、可能继承于其它项目。所谓继承,指当前项目某些未指定的配置采用父项目中的配置。
对应元素:
<parent>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!-- 默认../pom.xml optional-->
<relativePath>../pom.xml</relativePath>
</parent>
2、当前项目的基础信息。
<!-- groupId等未指定时会继承父工程的设置 -->
<groupId>study.maven</groupId>
<artifactId>study-pom</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<!-- optional 工程名,貌似没什么用 -->
<name>study-pom</name>
<!-- optional 这个工程的主页url,可指定为仓库位置等 -->
<url>http://maven.apache.org</url>
<!-- optional 描述 -->
<description>a project for study maven</description>
<!-- optional -->
<contributors></contributors>
<!-- optional 开发者 -->
<developers></developers>
3、指定属性值。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 自定义属性 -->
<myproperty>value</myproperty>
</properties>
4、当前工程的依赖工程。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
说明:项目的scope 取值为:compile, runtime, test, system, 或 provided
5、当前工程的子工程的依赖配置。可选,配置后继承于该工程的子工程的某些依赖项配置可简化。
<dependencyManagement>
<dependencies>
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<scope></scope>
<!-- scope为system 时才用 。指定此依赖项在文件系统中的绝对路径 -->
<systemPath></systemPath>
<!-- 可以指定两个不同的classifier值,用于同一个pom.xml文件的2个不同的构建。最后被加在<filename>元素值后 -->
<classifier>versionOne</classifier>
<!-- 是否可选,true|false 默认false-->
<optional></optional>
<!-- 此依赖性的类型,jar|war|pom 默认jar-->
<type></type>
<!-- 此依赖项包含多个artifact 时,指定哪些需要被排除 -->
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
6、不同构建配置。貌似每个profile都是一个完整的项目构建配置。
<profiles>
<profile>
<activation>
<!-- 指定是否默认激活 -->
<activeByDefault></activeByDefault>
<!-- 以下4个元素4选一,决定激活条件 -->
<!-- 柑根据某个文件是否存在决定是否激活 -->
<file></file>
<!-- 根据jdk版本是否匹配决定是否激活 -->
<jdk></jdk>
<!-- 根据操作系统决定是否激活 -->
<os></os>
<!-- 某个属性被指定时激活 -->
<property></property>
</activation>
<build>...</build>
</profile>
<profile>...</profile>
</profiles>
7、远程插件仓库。可选。
<pluginRepositories>
<pluginRepository>
<id></id>
<name></name>
<!-- 此仓库定位或存储artifact的方式, legace|default-->
<layout></layout>
<!-- 如何从此仓库执行下载 -->
<releases>
<!-- 失败后提示,ignore|fail|warn ,默认warn-->
<checksumPolicy></checksumPolicy>
<!-- 是否用此仓库下载这个类型,不解 -->
<enabled></enabled>
<!-- 下载更新的频率 -->
<updatePolicy></updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
8、远程依赖于扩展仓库。可选。
<repositories>
<repository>
<id></id>
<url></url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
9、文档相关配置。可选。
<!-- 对maven site命令的相关配置 -->
<reporting>
<!-- 是否将报告包含在站点 -->
<excludeDefaults></excludeDefaults>
<!-- 指定报告存放位置,默认${project.build.directory}/site . -->
<outputDirectory></outputDirectory>
<plugins>
<plugin>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<configuration>
</configuration>
<!-- 当前工程的子工程能否继承该插件的configuration配置 -->
<inherited></inherited>
<reportSets>
<reportSet>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
10、项目所属组织信息。可选。
<!-- 此工程所属组织 -->
<organization>
<name></name>
<url></url>
</organization>
11、项目发布到远程仓库或服务器。可选。一般应该不直接发布到远程仓库,而是通过Git 等工具发布。
<!-- 发布管理(配置发布到远程仓库或服务器),optional -->
<distributionManagement>
<!-- 用于指定此工程的下载地址,没有指定时,会将用户导向<url>的地址 ,主要在远程仓库没有此artifactId时有用,optional-->
<downloadUrl></downloadUrl>
<!-- 用于当工程移动到其它组或改变artifactId时的重新指定下载路径,optional -->
<relocation></relocation>
<!-- 发布到哪个远程仓库 -->
<repository></repository>
<!-- 发布此工程的web站点 -->
<site></site>
<!-- 默认为<repository>的值> -->
<snapshotRepository></snapshotRepository>
<!-- 不能设置在此项目中 -->
<status></status>
</distributionManagement>
二、访问pom.xml 或settings.xml中属性/元素值
1、访问pom.xml 中元素值
${project.basedir}:项目路径,即pom.xml所在的文件夹.
${project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/. ${project.build.testSourceDirectory}:项目的测试源码目录,默认为/src/test/java/. ${project.build.directory}:项目构建输出目录,默认为target/.
${project.outputDirectory}:项目主代码编译输出目录,默认为target/classes/. ${project.testOutputDirectory}:项目测试代码编译输出目录,默认为target/testclasses/.
${project.groupId}:项目的groupId. ${project.artifactId}:项目的artifactId. ${project.version}:项目的version,于${version}等价
${project.build.finalName}:默认为${project.artifactId}-${project.version}.
2、访问settings.xml 中元素值:
${settings.localRepository}:访问settins.xml 中设置的本地仓库路径。
即,用${project.xxx}对pom.xml中元素值进行访问,用${settings.xxx}对settings.xml中元素值进行访问,xxx为元素名。
pom.xml中可以访问自身或settings.xml中某些属性。
具体查看wiki:
https://cwiki.apache.org/confluence/display/MAVEN/Maven+Properties+Guide
Maven 官网在线使用指南:
http://maven.apache.org/guides/getting-started/index.html#What_is_a_SNAPSHOT_version