maven(一)安装与配置
maven(二)的生命周期与阶段
maven(三)配置文件
maven(四)的仓库
maven(五)的自动化构建
maven(六)的自动化部署
maven(七)的依赖管理
项目级别配置文件:pom.xml
用户级别的配置文件: %USER_HOME%/.m2/settings.xml
全局(Global)配置文件:%M2_HOME%/conf/settings.xml
3.1 项目级别的配置文件 pom
POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息。
执行任务或目标(goal)时,Maven会在当前目录中查找POM。它读取POM,获取所需的配置信息,然后执行目标。
POM 中可以指定以下配置:
- 项目的基本信息配置 groupId,artifactId,version
- 项目的父项目配置 parent
- 项目依赖配置 dependencies dependencyManagement
- 项目仓库配置 repositories
- 项目部署配置 distributionManagement
- 项目scm配置 scm
- 项目构建配置 bulid
- 项目构建多文件配置 profiles
- 项目开发者列表 developers
- 相关邮件列表信息 mailingLists
3.1.1 pom中项目的基本信息配置
<?xml version="1.0" encoding="UTF-8"?>
<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.example.demo</groupId>
<artifactId>test-maven</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>test-maven</name>
<url>http://www.baidu.com/test-maven</url>
<description>A maven project to test-maven.</description>
</project>
解释:
<modelVersion>
声明配置文件遵循哪一个POM模型版本。<groupId>
项目的全球唯一标识符,通常使用全限定的包名区分该项目和其他项目,并且构建时生成的路径也是由此生成。<artifactId>
构件的标识符,它和groupID一起构成了项目构件的唯一标识<packaging>
项目产生的构件类型,例如jar、war、ear、pom。<version>
项目当前版本,格式为:主版本.次版本.增量版本-限定版本号<name>
项目的名称, Maven产生的文档用。<url>
项目主页的URL, Maven产生的文档用 .<description>
项目的详细描述, 可以使用html格式描述, Maven 产生的文档用。
3.1.2 pom中父项目配置
<parent>
<artifactId />
<groupId />
<version />
<relativePath />
</parent>
解释:
-
<parent>
父项目的坐标。如果子项目中没有规定某个元素的值,那么默认继承父项目中该元素的值。 -
<relativePath />
父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom。
超级父项目(Super POM)
Super POM是Maven默认的POM,所有的 POM 都继承自一个Super POM(无论是否显式定义了这个Super POM)。
Super POM包含了一些可以被继承的默认设置,比如默认的仓库,因此,当 Maven发现需要下载 POM 中的依赖时,会到Super POM中配置的默认仓库 http://repo1.maven.org/maven2 去下载。
可以使用以下命令来查看 Super POM 默认配置:
mvn help:effective-pom
3.1.3 pom中项目依赖配置
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact</artifactId>
<version>3.8.1</version>
<type>jar</type>
<classifier></classifier>
<scope>test</scope>
<systemPath></systemPath>
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
<optional>true</optional>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
......
</dependency>
</dependencies>
</dependencyManagement>
解释:
-
<dependencies>
描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节 -
<dependency>
描述一个依赖 -
<groupId>
依赖的groupId -
<artifactId>
依赖的artifact ID -
<version>
依赖的版本号 -
<type>
依赖类型,默认类型是jar, 表示依赖的文件的扩展名。其他扩展名类型的例子:jar,war,ejb-client和test-jar。如果设置extensions为 true,就可以在 plugin里定义新的类型。 -
<classifier>
依赖的分类器。分类器可以区分属于同一个POM,但不同构建方式的构件。分类器名被附加到文件名的版本号后面。例如,如果你想要构建两个单独的构件成JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,你就可以使用分类器来生成两个单独的JAR构件。 -
<scope>
依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来。- compile :默认范围,用于编译 。
- provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath 。
- runtime:在执行时需要使用 。
- test:用于test任务时使用 。
- system:需要外在提供相应的元素。通过systemPath来取得stemPath: 仅用于范围为system, 提供相应的路径 。
- optional:当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用。
-
<systemPath>
仅供system依赖范围使用。注意,不鼓励使用这个元素,并且在新的版本中该元素可能被覆盖掉。该元素为依赖规定了文件系统上的路径。需要绝对路径而不是相对路径。推荐使用属性匹配绝对路径,例如${java.home} -
<exclusions>
当计算传递依赖时, 从依赖构件列表里,列出被排除的依赖构件集。此元素主要用于解决版本冲突问题。 -
<optional>
可选依赖,如果你在项目B中把C依赖声明为可选,你就需要在依赖于B的项目(例如项目A)中显式的引用对C的依赖。可选依赖阻断依赖的传递性。 -
<dependencyManagement>
声名依赖信息,如果项目依赖(dependencies)中使用了被声明的依赖,则通过group ID和artifact ID 匹配到声明的依赖,并使用声明的依赖信息(比如版本信息)。
3.1.4 pom中项目仓库配置
<repositories>
<repository>
<id>nexusmy</id>
<name>Team Maven Repository</name>
<url>http://localhost:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
<layout>default</layout>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexusmy</id>
<name>Team Maven Repository</name>
<url>http://localhost:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
解释:
<repositories>
:配置远程仓库列表<repositorie>
:配置远程仓库<pluginRepositories>
: 配置插件的远程仓库列表<pluginRepository>
: 配置插件的远程仓库<id>
: 配置远程仓库唯一标识符。可以用来匹配在settings.xml文件里配置的远程仓库<name>
: 配置远程仓库的名称<url>
:远程仓库URL,按protocol://hostname/path形式<layout>
: 用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)<releases>
:配置仓库中发布版的一些属性<snapshots>
:配置仓库中快照版的一些属性<enabled>
: 配置该仓库是否开启下载某种类型构件(发布版,快照版)-
<updatePolicy>
配置更新发生的频率。Maven会比较本地POM和远程POM的时间戳,可选项如下:
- always(一直)
- daily(默认,每日)
- interval:X(这里X是以分钟为单位的时间间隔)
- never(从不)
<checksumPolicy />
: 配置Maven验证构件校验文件失败时的策略:ignore(忽略),fail(失败),或者warn(警告)。<uniqueVersion>
是分配给快照一个唯一的版本号(由时间戳和构建流水号)?还是每次都使用相同的版本号?
3.1.5 pom中项目部署配置
<distributionManagement>
<repository>
<uniqueVersion />
<id>banseon-maven2</id>
<name>banseon maven2</name>
<url>file://${basedir}/target/deploy</url>
<layout />
</repository>
<snapshotRepository>
<uniqueVersion />
<id>banseon-maven2</id>
<name>Banseon-maven2 Snapshot Repository</name>
<url>scp://svn.baidu.com/banseon:/usr/local/maven-snapshot</url>
<layout />
</snapshotRepository>
<site>
<id>banseon-site</id>
<name>business api website</name>
<url>scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web</url>
</site>
<downloadUrl />
<relocation>
<groupId />
<artifactId />
<version />
<message />
</relocation>
<status />
</distributionManagement>
解释:
<distributionManagement>
:项目分发信息,表示要发布的位置, 在执行mvn deploy后把网站部署到远程服务器或者把构件部署到远程仓库。<repository>
构件的发布版部署到哪里<snapshotRepository>
构件的快照版部署到哪里<site>
: 配置网站部署到哪里<downloadUrl>
: 项目下载页面的URL<relocation>
: 如果构件有了新的group ID和artifact ID(构件移到了新的位置),列出构件的重定位信息<message>
: 显示给用户的,关于移动的额外信息,例如原因<status>
: 给出该构件在远程仓库的状态。不得在本地项目中设置该元素,因为这是工具自动更新的。
有效的值有:
- none(默认)
- converted(仓库管理员从 Maven 1 POM转换过来)
- partner(直接从伙伴Maven 2仓库同步过来)
- deployed(从Maven 2实例部 署)
- verified(被核实时正确的和最终的)。
3.1.6 pom中scm配置
<scm>
<connection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)
</connection>
<developerConnection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk
</developerConnection>
<tag />
<url>http://svn.baidu.com/banseon</url>
</scm>
解释:
-
<scm>
: SCM(Source Control Management)标签允许你配置你的代码库,供Maven web站点和其它插件使用。 -
<connection>
: 代码库的地址,连接只读 -
<developerConnection>
: 给开发者使用的代码库的地址,该连接不仅仅只读 -
<tag>
: 当前代码的标签,在开发阶段默认为HEAD -
<url>
:在浏览器上代码库的地址
3.1.7 pom中项目构建配置bulid
<build>
<sourceDirectory>D:\mycode\test-maven\src\main\java</sourceDirectory>
<scriptSourceDirectory>D:\mycode\test-maven\src\main\scripts</scriptSourceDirectory>
<testSourceDirectory>D:\mycode\test-maven\src\test\java</testSourceDirectory>
<outputDirectory>D:\mycode\test-maven\target\classes</outputDirectory>
<testOutputDirectory>D:\mycode\test-maven\target\test-classes</testOutputDirectory>
<defaultGoal />
<resources>
<resource>
<directory>D:\mycode\test-maven\src\main\resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>D:\mycode\test-maven\src\test\resources</directory>
</testResource>
</testResources>
<directory>D:\mycode\test-maven\target</directory>
<finalName>test-maven-1.0-SNAPSHOT</finalName>
<filters/>
<pluginManagement>
<plugins>
<plugin>
......
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
......
</plugin>
</plugins>
</bulid>
解释:
-
<sourceDirectory>
: 项目源码目录,当构建项目的时候,构建系统会编译目录里的源码(相对于pom.xml的相对路径)。 -
<scriptSourceDirectory>
项目脚本源码目录,该目录和源码目录不同:绝大多数情况下,该目录下的内容会被拷贝到输出目录。 -
<testSourceDirectory>
: 项目单元测试使用的源码目录,当测试项目的时候,构建系统会编译目录里的源码。 -
<outputDirectory>
:被编译过的应用程序class文件存放的目录. -
<testOutputDirectory>
:被编译过的测试class文件存放的目录。 -
<defaultGoal>
:当项目没有规定目标(Maven2 叫做阶段)时的默认值 。 -
<resources>
: 项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。 -
<testResources>
:单元测试相关的所有资源路径,例如和单元测试相关的属性文件。 -
<directory>
: 构建产生的所有文件存放的目录。 -
<finalName>
: 将调用所生成构件的文件名(不包括扩展名,并且没有路径信息) -
<filters/>
:启用筛选时使用的筛选属性文件列表。 -
<pluginManagement>
: 在一组pom中使用的默认插件信息的管理部分 -
<plugins>
配置使用的插件列表
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>antrun-pre-clean</id>
<phase>pre-clean</phase>
<configuration>
<target>
<echo message="run plugin"/>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
<inherited>true</inherited>
</execution>
</executions>
<inherited>true</inherited>
<extensions>false</extensions>
<dependencies>
<dependency>
......
</dependency>
</dependencies>
</plugin>
</plugins>
解释:
-
<executions>
:在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。 -
<execution>
:执行一个目标的配置 -
<id>
: 执行目标的标识符,用于标识构建过程中的目标 -
<phase>
: 绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段 -
<goals>
: 配置的执行目标 -
<inherited>
: 配置是否被传播到子POM -
<configuration>
: 作为DOM对象的配置 -
<extensions>
: 是否从这里加载Maven扩展(例如打包和类型处理程序) 插件。 出于性能原因,应该只在必要时启用 -
<dependencies>
: 项目引入插件所需要的额外依赖
3.1.8 pom中项目构建多文件配置 profiles
<profiles>
可以定义在pom中,用户级配置setting中,全局配置setting中。
<profiles>
<profile>
<id>dev</id>
<activation></activation>
<build></build>
<reporting></reporting>
<modules></modules>
<repositories></repositories>
<pluginRepositories></pluginRepositories>
<dependencyManagement></dependencyManagement>
<dependencies></dependencies>
</profile>
<profile>
<id>fat</id>
<activation></activation>
<build></build>
<reporting></reporting>
<modules></modules>
<repositories></repositories>
<pluginRepositories></pluginRepositories>
<dependencyManagement></dependencyManagement>
<dependencies></dependencies>
</profile>
</profiles>
解释:
<profiles>
:项目本地构建配置文件的列表,它将在激活时修改构建过程。<profile>
:项目本地某个构建配置文件。<id>
: profile的唯一标识符。即用于命令行激活,也用于在继承时合并具有相同标识符的profile。<activation>
: 配置自动激活profile的方式<modules>
:作为该项目的一部分构建的模块(有时称为子项目)。列出的每个模块都是包含该模块的目录的相对路径。<reporting>
:该元素包括使用报表插件产生报表的规范。当用户执行"mvn site",这些报表就会运行。 在页面导航栏能看到所有报表的链接。
<activation>
激活方式配置
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
<os>
<!--激活profile的操作系统的名字 -->
<name>Windows XP</name>
<!--激活profile的操作系统所属家族(如 'windows') -->
<family>Windows</family>
<!--激活profile的操作系统体系结构 -->
<arch>x86</arch>
<!--激活profile的操作系统版本 -->
<version>5.1.2600</version>
</os>
<!--如果Maven检测到某一个属性(其值可以在POM中通过${名称}引用),其拥有对应的名称和值,Profile就会被激活。如果值 字段是空的,那么存在属性名称字段就会激活profile,否则按区分大小写方式匹配属性值字段 -->
<property>
<!--激活profile的属性的名称 -->
<name>mavenVersion</name>
<!--激活profile的属性的值 -->
<value>2.0.3</value>
</property>
<!--提供一个文件名,通过检测该文件的存在或不存在来激活profile。missing检查文件是否存在,如果不存在则激活 profile。另一方面,exists则会检查文件是否存在,如果存在则激活profile。 -->
<file>
<!--如果指定的文件存在,则激活profile。 -->
<exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</exists>
<!--如果指定的文件不存在,则激活profile。 -->
<missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</missing>
</file>
</activation>
解释:
-
<activation>
:配置自动激活profile的方式。Activation是profile的激活的一种方式。 -
<activeByDefault>
:配置是否默认激活profile -
<jdk>
:当匹配jdk版本时,profile被激活。 -
<os>
:当匹配操作系统属性时,profile将被激活。 -
<property>
:指定此系统属性时,profile将被激活。 -
<file>
:文件的存在或者不存在时,profile将被激活。
profile的激活方式:
-
在命令控制台中使用 maven 命令激活 profile:
mvn test -Pdev
命令说明:第一个 test 为 Maven 生命周期阶段, dev 为构建配置文件指定的
<id>
参数,这个参数通过 -P 来传输。 -
通过Maven设置激活配置文件,在settings.xml文件中添加配置
<settings 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/settings-1.0.0.xsd"> ... <activeProfiles> <activeProfile>dev</activeProfile> </activeProfiles> </settings>
-
通过环境变量激活配置文件 以及
<activation>
配置在profile中增加配置
<activation> <property> <name>env</name> <value>test</value> </property> </activation>
在命令控制台中使用 maven 命令:
mvn test -Denv=test