Maven基础
1.Maven的配置文件setting.xml
Maven的配置文件setting.xml中的几个常用默认参数
默认本地仓库路径:
<!-- localRepository| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>c:\.m2\repository</localRepository>
默认groupId:
<pluginGroups><!-- pluginGroup
| Specifies a further group identifier to use for plugin lookup.
<pluginGroup>com.your.plugins</pluginGroup>
<pluginGroup>org.jenkins-ci.tools</pluginGroup>
-->
<pluginGroup>org.apache.maven.plugins</pluginGroup>
</pluginGroups>
Maven默认以org.apache.maven.plugins作为groupId。也可以修改,为自己指定一个默认的groupId,例如com.yourcompanyname.plugins。
2.pom(Project Object Model)
Maven项目的所有配置都存放在.pom配置文件中,包括如下定义:项目类型、名字、依赖关系和定制插件的行为等。
<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.xyz.helloworld</groupId>
<artifactId>helloworld</artifactId>
<description>helloworld test prj</description>
<name>helloworld</name>
<properties>
......
</properties>
<dependencies>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
......
</dependencies>
......
</project>
new project的时候指定的三个属性:GroupId、ArtifactId、Version
GroupId:com.xyz.helloworldArtifactId:helloworld
Version:0.0.9-SNAPSHOT
工程创建以后,会自动生成.pom配置文件,自动生成的.pom配置文件包含groupId, artifactId, version等信息:
<groupId>com.xyz.helloworld</groupId><artifactId>helloworld</artifactId>
<version>0.0.9-SNAPSHOT</version>
pom中的groupId, artifactId, version叫作maven坐标,maven坐标能唯一确定一个项目的标识。
maven坐标的元素包括:groupId, artifactId, version,package,classifier。
groupId:项目组织唯一的标识符,定义了项目属于哪个组。实际对应Java的包的结构,是main目录里java的目录结构。一般用:com.company.myapp,例如:com.xyz.helloworld
artifactId:项目的唯一的标识符,定义了当前项目在项目组织中的唯一的ID。实际对应项目的名称,就是项目根目录的名称。例如:helloworld-web;helloworld-srv
version:指定项目的当前版本,SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本。在引用依赖的时候,可以通过指定version来确定具体依赖的版本号
上面这三个参数指出了一个项目的特定版本,让Maven知道我们正在处理的是谁,以及什么时候在我们想要的软件生命周期中。
packaging:可选。规定项目的输出格式,包括 pom, jar, maven-plugin, ejb, war, ear, rar, par,根据实际需要确定。当不定义packaging时,maven会使用默认值jar。
classifier:元素用来帮助定义构件输出的一些附属构件,一般用不到。
有了maven坐标,我们就可以用它来指定一个项目所依赖的其他项目、插件、父项目。
pom中的其他常用属性:
name:可选。指定一个项目名称,非必须的,但是为了方便交流,推荐为每个pom声明name。
description:项目的描述。现实场景中,往往一个大的项目会分成几个子项目。这种情况下,每个子项目就都会有各自的pom文件,然后多个子项目会有一个共同的父项目。这样只要构建父项目就能够构建所有的子项目了。子项目的pom会继承父项目的pom。
pom中引入插件时要注意,很多插件是super pom中并没有配置的,如果用户使用某个插件时没有设定版本,那么则会一定规则去仓库中查找可用的版本,然后做出选择。
在Maven2中,插件的版本会被解析至latest。latest表示的就是最新版本,而这个版本很有可能是快照版本,如果快照版本发生变化,程序执行可能会出错。
在Maven3中调整了解析机制,当插件没有声明版本的时候,不再解析至latest,而是使用最新的release版本。如果发布了新的release,则同样可能导致问题。存在隐患。
因此引用插件时推荐指定版本。
3.super pom
所有的项目pom都继承了一个super pom。在maven-model-builder-{version}.jar包中存在这样一个文件:org/apache/maven/model/pom-4.0.0.xml,所有的pom文件都继承该pom文件。
我的文件路径:C:\.m2\repository\org\apache\maven\maven-model-builder\3.0\maven-model-builder-3.0.jar,打开这个jar包:org/apache/maven/model/pom-4.0.0.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
...
<!-- START SNIPPET: superpom -->
<project>
<modelVersion>4.0.0</modelVersion>
<repositories>
<repository>
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repo1.maven.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
......
</project>
<!-- END SNIPPET: superpom -->
super pom设置了一些默认值,比如在第一篇文章中提到的默认的目录结构,默认的插件等等,它遵循了惯例优于配置的原则。所以尽管我们的这个pom配置很简单,但是这只是我们看见的一部分。真正运行时候的pom要复杂很多。
通过下面的命令,我们可以看到真正运行的时候的pom的全部内容:
mvn help:effective-pom4.Maven依赖
pom文件中进行Maven项目的依赖管理:
<dependencies><dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
5.Maven库
当第一次运行maven命令的时候,需要联网,因为它要从maven默认的远程仓库网上下载一些文件。远程库提供了maven的核心插件和可供下载的插件jar包。
下载保存到本地仓库,默认本地仓库路径为~/.m2/repository(Windows默认为用户目录下的.m2,例如C:\Users\Administrator\.m2)。
Maven查找jar时先从本地仓库查找,本地没有,才会去远程仓库下载。
项目jar包安装到本地仓库:
mvn install一个项目mvn install安装到本地库以后,其他项目就可以通过maven坐标和这个项目建立依赖关系。
例如:helloworld通过mvn install安装以后,新建其他项目需要用到helloworld,就可以如下所示来建立依赖关系:、
<dependency><groupId>com.xyz.helloworld</groupId>
<artifactId>helloworld</artifactId>
<version>0.0.9-SNAPSHOT</version>
</dependency>