1、maven简介
maven是跨平台的项目管理工具,主要功能项目构建、依赖管理、项目信息管理。
项目构建:以指令的方式执行编译源码、测试程序、生成文档、打包和部署等工作
依赖管理:自动管理项目依赖的构件(类库,插件等)
项目信息管理:可以轻松生成项目文档、测试报告等(可能要借助一些插件)
2、maven的配置
系统级配置文件:安装目录下的conf/settings.xml文件
用户级配置文件:~/.m2/settings.xml文件
项目级配置文件:项目根目录下的pom.xml文件
公司内网出于安全考虑,可能需要配置代理来访问外部仓库,一般代理配置在~/.m2/settings.xml文件
<settings>
......
<proxies>
<proxy>
<id>my_proxy</id>
<active>true/false</active> 激活(true)该代理,如果有多个代理,默认第一个被激活的代理将生效
<protocol>http</protocol>
<host>218.14.227.197</host>
<port>3128</port>
<!-- 若代理要求认证,则需要以下信息
<username>******</username>
<password>******</password>
<nonProxyHosts>repository.mycom.com|*.google.com</nonProxyHosts> 指代哪些网站可以直接访问,不需要代理
-->
</proxy>
</proxies>
......
</settings>
3、maven入门
a.项目目录结构
主代码:src/main/java
资源代码:/src/main/resources
测试代码:src/test/java
资源代码:src/test/resources
b.生成项目框架
maven3: mvn archetype:generate
maven2: mvn org.apache.maven.plugins:maven-archetype-plugin:2.0-alpha-5:generate
注意:maven3会自动解析maven-archetype-plugin插件的最新稳定版本,所以可以省略掉插件版本,直接使用“插件前缀+插件目标”即可
maven2会去下载最新版本的插件,很可能是不稳定的SNAPSHOT版本,所以适用maven2生成项目框架,最好写全面一些
c.属性定义
<properties>
<propertie_name>propertie_value</propertie_name> ---> 使用${propertie_name}
</properties>
d.命令调用
mvn phase1 phase2
mvn perfix:goal
4、坐标与依赖
a.坐标详解
每个构建(依赖或插件)都需要一个坐标,通过坐标以及仓库的布局方式即可定位出构建的位置
<groupId>org.apache.spark</groupId> 当前模块(项目)隶属的实际项目名
<artifactId>spark-core_2.11</artifactId> 当前项目名
<version>2.1.0</version> 版本号
<packaging>jar/war</packaging> 定义本项目打包方式,默认jar
<classifier> </classifier> 定义输出的附属构件,比如javadoc(包含文档)、sources(包含源码)不能直接定义
<name>DuJian</name> 执行mvn指令时,输出中会显示该名字
b.依赖配置
<dependencies>
<dependency>
<groupId>******</groupId>
<artifactId>******</artifactId>
<version>******</version>
<type>jar/war</type> 此依赖的打包类型,默认值为jar
<scope>provided/test/runtime/compile</scope> 依赖可用的范围,即依赖可以在哪些地方可用(编译主代码、编译运行测试代码、运行主代码),间接依赖(传递性依赖)的范围参考相关书籍
<option>true/false</option> 标记依赖是否可选,可选依赖的依赖项不会传递到当前项目中
<exclusions> 排除该依赖的依赖项
<exclusion>
<groupId>******</groupId>
<artifactId>******</artifactId>
</exclusion>
</exclusions> 排除一些版本不稳定的依赖(排除后需要自己显示定义稳定版本的依赖)
<dependency>
<dependencies>
注意:
依赖调解的原则:1、路径最近者优先 2、第一声明者优先
maven会解析各个直接依赖的pom,将那些必要的间接依赖,以依赖传递性的形式引入到当前的项目中,若依赖是可选的,则会切断传递性依赖。
c.依赖优化
mvn dependency:list ========> maven-dependency-plugin:2.8:list 查看当前项目已解析的依赖项以及依赖范围
mvn dependency:tree ========> maven-dependency-plugin:2.8:tree 查看当前项目的依赖树,了解依赖引入的路径
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 -Ddetail 查看插件信息
mvn -h mvn 指令的使用手册
注意:dependency、help都是插件前缀
8、仓库
仓库:可配置在pom.xml或者settings.xml
布局:依赖在仓库中的存储路径,default是groupId/artifactId/version/artifactId-version.packaging
<project>
......
<repositories>
<repository>
<id>******</id> 仓库唯一标识,若为central,则会覆盖掉中央仓库
<name>******</name> 仓库名字
<url>******</url>
<layout>******</layout> 仓库布局,布局决定了依赖在此仓库中的路径
<snapshots>
<enabled>false</enabled> 不从该仓库下载快照版本的依赖
<updatePolicy>daily/never/always</updatePolicy> 从远程仓库检查更新的频率
<checksumPolicy>ignore/warn/fail</checksumPolicy>
</snapshots>
<releases>
<enabled>true</enabled> 从该仓库下载发布版本的构件
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</releases>
</repository>
</repositories>
......
</project>
仓库的认证信息(只能在setting中设置)
<settings>
......
<servers>
<server>
<id>******</id> 必须与仓库配置中repository元素中的id对应
<username>******</username>
<password>******</password>
</server>
</servers>
......
</settings>
将构件部署到远程仓库
mvn deploy 安装到本地仓库并部署到远程仓库
mvn install 安装到本地仓库
<project>
......
<distributionManagement>
<repository>******</repository> 发布版本构件的部署仓库
<id>******</id>
<name>******</name>
<url>******</url>
</repository>
<snapshotsRepository> 快照版本的构件部署仓库
<id>******</id>
<name>******</name>
<url>******</url>
</snapshotsRepository>
</distributionManagement>
......
</peoject>
注意:往远程仓库部署构建,可能也需要认证,方法同上
镜像:如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像
<settings>
......
<mirrors>
<mirror>
<id>******</id>
<name>******</name>
<url>******</url>
<mirrorOf>******</mirrorOf> 关联的仓库的id,例如central
/<mirror>
</mirrors>
......
</settings>
9.生命周期(包含很多阶段phase)与插件(包含很多目标goal)
生命周期的有些阶段绑定了默认的插件目标
生命周期与插件目标的内置(默认)绑定关系(以jar打包方式为例):
clean:
pre-clean
clean maven-clean-plugin:clean
post-clean
default:
validate
initialize
generate-sources
process-sources
generate-resources
process-resources maven-resources-plugin:resources
compile maven-compile-plugin:compile
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources maven-resources-plugin:testResources
test-compile maven-compile-plugin:testCompile
process-test-classes
test maven-surefire-plugin:test
prepare-package
package maven-jar-plugin:jar
pre-integration-test
integration-test
post-integration-test
verity
install maven-install-plugin:install
deploy maven-deploy-plugin:deploy
site:
pre-site
site maven-site-plugin:site
post-site
site-deploy maven-site-plugin:deploy
生命周期与插件目标的自定义绑定关系:比如将maven-source-plugin插件的jar-no-fork目标绑定到verify阶段,以生成项目的源码jar包
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution> 代表一个任务:phase+goal
<id>attach-source</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
插件配置:
1、命令行配置
2、全局配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compile-plugin</artifactId>
<version>2.1</version>
<configuration> 此配置对插件的所有目标都适用,所以影响到适用该目标的所有阶段
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
3、任务配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compile-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<id>ant-validate</id>
<phase>validate</phase>
<goals>
<goal>run</goal>
</goals>
<configuration> 此配置对插件的run目标+validate阶段适用
<tasks>
<echo>I am bound to validate phase.</echo>
</tasks>
</configuration>
</execution>
<execution>
<id>ant-verify</id>
<phase>verify</phase>
<goals>
<goal>run</goal>
</goals>
<configuration> 此配置对插件的run目标+verify阶段都适用
<tasks>
<echo>I am bound to validate phase.</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
12、插件仓库:
<pluginRepositories>
<pluginRepository>
<id>******</id>
<name>******</id>
<url>******</url>
<layout>default</layout>
<snapshots>
<enabled>true/false</enabled>
</snapshots>
<releases>
<enabled>true/false</enabled>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
maven-clean-plugin:2.5:clean
maven-resources-plugin:2.6:resources
maven-compiler-plugin:3.1:compile
maven-resources-plugin:2.6:testResources
maven-compiler-plugin:3.1:testCompile
maven-surefire-plugin:2.12.4:test
maven-jar-plugin:2.4:jar
maven-shade-plugin:1.2.1:shade
maven-install-plugin:2.4:install
-----------------------------------------------------------
maven-clean-plugin:2.5:clean maven-clean-plugin:2.5:clean
maven-resources-plugin:2.6:resources maven-resources-plugin:2.6:resources
maven-compiler-plugin:3.6.0:compile maven-compiler-plugin:3.1:compile
maven-scala-plugin:2.15.2:compile ----------maven-scala-plugin:2.15.2:compile
maven-resources-plugin:2.6:testResources maven-resources-plugin:2.6:testResources
maven-compiler-plugin:3.6.0:testCompile maven-compiler-plugin:3.1:testCompile
maven-scala-plugin:2.15.2:testCompile ------maven-scala-plugin:2.15.2:testCompile
maven-surefire-plugin:2.12.4:test maven-surefire-plugin:2.12.4:test
maven-jar-plugin:2.4:jar maven-jar-plugin:2.4:jar
maven-shade-plugin:3.2.0:shade maven-shade-plugin:1.2.1:shade
maven-install-plugin:2.4:install maven-install-plugin:2.4:install
--------------------------------------------------------------