1. maven 坐标和依赖
1.1 坐标
<groupId>com.sdc</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
①groupId: 定义当前Maven项目隶属的实际项目。
②artifactId:该元素定义实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目名称作为artifactId的前缀。
③version:该元素定义Maven项目当前所处的版本。
④packaging:该元素定义Maven项目的打包方式(默认jar[war,pom,maven-plugin,ear])。
⑤classifier:该元素用来帮助定义构架输出的一些附属构件(次元素不能直接定义,因为生成的附属构件有支持的插件实现)。
上述5个元素中,groupId、artifactId、version是必须定义的,packaging时可选项(默认jar),而classifier是不能直接定义的。
1.2 依赖
<dependency>
<groupId>...</groupId>
<artifactId>..</artifactId>
<version>...</version>
<type>依赖的类型,对应于项目左边定义的packaging。(默认jar)</type>
<scope>依赖的范围</scope>
<optional>标记依赖是否可选</optional>
<exclusions>
<exclusion>
用来排除传递性依赖
</exclusion>
...
</exclusions>
</dependency>
1.2.1 依赖范围
依赖范围就是用来控制依赖与这三种classpath(编译classpath、测试classpath、运行classpath)的关系,Maven有一下几种依赖范围:
① compile:编译依赖范围。默认依赖范围。对于编译、测试、运行三种classpath都有效。例子:spring-core 在三个范围内都需要使用该依赖。
② test:测试依赖范围。只对于测试classpath有效。典型的例子:jUnit。
③ provided:已提供依赖范围。对于编译和测试classpath有效,但在运行时无效。例子:servlet-api。
④ runtime:运行时依赖范围。对于测试和运行classpath有效,但在编译主代码时无效。例子:jdbc驱动实现。
⑤ system:系统依赖范围。与provided依赖范围一致。但使用system范围的依赖时必须通过systemPath元素显示地指定依赖文件的路径。(可在成构建的不可移植,慎用)
⑥ import(Maven 2.0.9及以上):导入依赖范围。(继承)
1.2.2 依赖传递
Maven 依赖调解(DependencyMediation)的第一原则是:路径最近者优先。
Maven定义了依赖调解的第二原则:第一声明者优先。
1.2.3 可选依赖
<optional>true</optional> : 对直接依赖当前项目(A)的项目(B)会产生影响。但对依赖项目(B)的项目(C)而言,项目(A)不会对项目(C)产生任何影响。
1.2.4 优化依赖
查看已解析依赖:mvn dependency:list
(已解析依赖:经过依赖处理后,确保任何一个构件只有唯一额版本在依赖中存在、)
查看依赖树:mvn dependency:tree
分析依赖关系:mvn dependency:analyze
(只会分析编译主代码和测试代码需要用到的依赖,一些执行测试和运行时需要的依赖它就发现不了。例:spring-core和spring-beans是运行项目必要的类库,但分析时可能显示费必须依赖,但显然是不能直接删除spring依赖的)
2. 仓库
任何一个依赖、插件或者项目构建的输出,都可以称为构件。
2.1 仓库的布局
groupId/artifactId/version/artifactId-version.packaging
2.2 仓库的分类
对Maven来说,仓库只分为两类:本地仓库和远程仓库。
Maven仓库->|
|->本地仓库
|->远程仓库->|
|->中央仓库
|->私服
|->其他公共库
①本地仓库的配合 ~/.m2/setting.xml
<localRepository>E:/m2re</localRepository>
②远程仓库的配置 pom.xml
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.com/maven2/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
releases、snapshots的其他标签
<snapshots>
<enabled>false</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</snapshots>
updatePolicy 配置从远程仓库检查更新的频率。默认daily,每天一次。
never - 从不检查更新
always - 每次构件都检查
interval:X - 每隔X分钟检查一次(X任意整数)
checksumPolicy用来配置Maven检查检验和文件的策略。
默认 warn, Maven会在执行构建时输出警告信息。
fail - Maven遇到校验和错误就让构件失败。
ignore - 使Maven完全忽略校验和错误。
2.3 部署至远程仓库
参考部署至私服 nexus(仓库配置和认证信息)。
2.4 镜像
</mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</mirror>
</mirrors>
镜像高级配置:
<mirrorOf>*</mirrorOf> : 匹配所有远程仓库。
<mirrorOf>external:*</mirrorOf> : 匹配所有远程仓库,使用localhost除外,使用file://协议的除外。即皮蓬所有不在本机上的远程仓库。
<mirrorOf>repo1,repo2</mirrorOf> : 匹配仓库repo1和repo2。
<mirrorOf>*,!repo1</mirrorOf> : 匹配所有远程仓库,repo1除外。
由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定或者停止服务的时候,Maven仍将无法访问被镜像仓库,因而将无法下载构件。
3. maven 的生命周期和插件
3.1 生命周期
Mavne拥有三套相互独立的生命周期:clear、default、site。
每个生命周期包含一些阶段(phase),这些阶段使用顺序的。
3.1.1 clean生命周期
clean生命周期的目的是清理项目,它包含三个阶段:
pre-clean
clean
post-clean
3.1.2 default 生命周期
定义了真正构件时,所需要执行的所有步骤,它是所有生命周期中最核心的部分。
validate
initialize
generate-sources
process-sources处理项目主资源文件。(对src/main/resources目录内容进行变量替换,复制到项目输出的主classpath目录中)
generate-resources
process-resources
compile编译项目的主源码。(编译src/main/java目录下的java文件至项目输出的主classpath目录中)
process-classes
generate-test-sources
process-test-sources处理项目测试资源文件。(对src/test.resources目录的内容进行变量替换,复制到项目输出的测试classpath目录中)
generate-test-resources
process-test-resources
test-compile编译项目的测试代码。(编译src/test/java目录下的Java文件至项目输出的测试classpath目录中)
process-test-classes
test使用单元测试框架进行测试,测试代码不会被打包或部署。
prepare-package
package接受编译好的代码,打包成可发布的格式,如JAR。
integration-test
post-integration-test
verify
install将包安装到Maven本地仓库,供本地其他Maven项目使用。
deploy将最终的包复制到远程仓库,供其他开发人员和Maven项目使用。
3.1.3 site生命周期
目的是建立和发布项目站点,包含如下阶段:
pre-site执行一些在生成项目站点之前需要完成的工作。
site生成项目站点文档。
post-site执行一些在生成项目站点之后需要完成的工作。
site-deploy将生成的项目站点发布到服务器上。
3.1.4 命令行与生命周期
$mvnclean : pre-clean - clean。
$mvntest : default 周期到 test阶段之前所有阶段。
$mvnclean install : pre-clean - clean 和 default 周期到 test阶段之前所有阶段。
$mvn clean deploy site-deploy : pre-clean -clean 和default 周期到 test阶段之前所有阶段以及 site 所有阶段。
3.2 插件
3.2.1 生命周期和插件目标的对应关系
clean生命周期
clean maven-clean-plugin:clean
default生命周期
process-resources | maven-resources-plugin:resources | 复制主资源文件至主输出目录 |
compile | maven-compiler-plugin:compile | 编译主代码至主输出目录 |
process-test-resources | maven-resources-plugin:testResources | 复制测试资源文件至测试输出主目录 |
test-compile | maven-compiler-plugin:testCompile | 编译测试代码至测试输出目录 |
test | maven-surefire-plugin:test | 执行测试用例 |
package | maven-jar-plugin:jar | 创建项目jar包 |
install | maven-install-plugin:install | 将项目输出构件安装到本地仓库 |
deploy | maven-deploy-plugin:deploy | 将项目输出构件部署到远程仓库 |
site生命周期
site maven-site-plugin:site
site-deploy maven-site-plugin:deploy
3.2.2 自定义绑定
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
注:绑定在default生命周期verify阶段绑,打包源文件
3.2.3 maven-help-plugin的使用
执行mavne-help-plugin的describe目标。
$mvn help:describe -Dplugin=groupId:artifactId:version
$mvn help:describe-Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1
去掉版本信息,查看最新版本
$ mvn help:describe-Dplugin=org.apache.maven.plugins:maven-compiler-plugin
可以使用插件目标前缀替换坐标
$ mvn help:describe -Dplugin= compiler
仅仅描述摸个插件的目标信息,可以加上goal参数
$ mvn help:describe -Dplugin= compiler-Dgoal=compile
加上detail参数输出更详细信息
$ mvn help:describe-Dplugin= compiler -Ddetail
4. 聚合与集成
parent : pom.xml
<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sdc</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>com.sdc.parent</name>
<modules>
<module>../common</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
model : pom.xml
<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>common</artifactId>
<packaging>jar</packaging>
<name>common</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>com.sdc</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
</dependency>
</dependencies>
</project>
学习资料:《MAVEN实战》