基本配置
- POM:项目对象模型,Project Object Model
- <modelVersion>表示pom的版本,maven2和maven3中modelVersion只能是4.0.0
- mvn archetype:generate快速生成项目,格式为:groupId:artifactId:version:goal
- <packaging>:打包方式,默认是jar,还有:war、pom、maven-plugin、ear
依赖管理
dependency完全配置
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.2.2</version>
<type>jar</type>
<scope>compile</scope>
<optional>false</optional>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
<classifier>jdk15</classifier>
</dependency>
<scope>
- compile:默认
- test:测试包下可以,打包不加入,比如:junit
- provided:编译和测试的依赖,打包不加入,比如:servlet-api
- runtime:测试和运行有效,编译时不加入,比如:jdbc驱动
- system:本地文件依赖(本地仓库外的),没有移植性
<optional>
- 可选性依赖,可选性依赖的不会被传递,不建议使用
传递优先级
- 第一原则:路径短优先
- 第二原则:第一声明者优先(pom解析顺序)
最佳实践
- 用exclusion排除依赖
- 归类依赖,用properties定义变量统一版本
- 优化依赖,mvn dependency:list查看当前项目已解析依赖;mvn dependency:tree依赖树
仓库
- 本地仓库
- 中央仓库
- 远程仓库
- 依赖搜索顺序:优先找本地仓库,如果没有就去其他配置的远程仓库找,如果还找不到就去中央仓库找,如果中央仓库也没有则报错
- 可以做个私服,代理多个的远程仓库,并把公司的私有仓库放上面
配置远程仓库
<profiles>
<profile>
<id>cloudhopper</id>
<repositories>
<repository>
<id>cloudhopper</id>
<name>Repository name</name>
<url>http://maven.cloudhopper.com/repos/third-party/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>cloudhopper</activeProfile>
</activeProfiles>
</profiles>
如果远程仓库需要密码账号,可以在setting文件里面配置,注意id要一样
<servers>
<server>
<id>my-proj</id>
<username>repo-my</username>
<password>123123</password>
</server>
</servers>
中央仓库
中央仓库是一个id为central的repository,它是默认的远程仓库,它由maven社区提供,https://search.maven.org/#browse 可以帮助搜索里面的构件
索引地址
- http://mvnrepository.com/
- http://search.maven.org/
仓库下载地址
- https://repo1.maven.org/maven2/
- https://repository.jboss.org/maven2/
- https://repository.sonatype.org/content/groups/public/
- http://maven.aliyun.com/nexus/content/groups/public
- http://repo.springsource.org/libs-milestone-local
发布项目到私服
https://www.cnblogs.com/luotaoyeah/p/3817465.html
配置:
<distributionManagement>
<snapshotRepository>
<id>user-snapshot</id>
<name>User Porject Snapshot</name>
<url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
<uniqueVersion>true</uniqueVersion>
</snapshotRepository>
<repository>
<id>user-release</id>
<name>User Porject Release</name>
<url>http://localhost:8081/nexus/content/repositories/releases/</url>
</repository>
</distributionManagement>
命令:mvn clean deploy
镜像
镜像的作用和cdn很类似,因为GFW的关系,很多外国的仓库访问速度很慢或者无法访问,那么就可以借助一些国内的一些大公司提供的镜像地址来加快文件的下载,个人用的比较多的是阿里的镜像地址。
<settings>
...
<mirrors>
<mirror>
<id>maven.net.cn</id>
<name>one of the central mirrors in china</name>
<url>http://maven.net.cn/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
...
</settings>
复杂的需求,Maven还支持更高级的镜像配置:
- <mirrorOf>*</mirrorOf>
匹配所有远程仓库。
2. <mirrorOf>external:*</mirrorOf>
匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。也就是说,匹配所有不在本机上的远程仓库。
3. <mirrorOf>repo1,repo2</mirrorOf>
匹配仓库repo1和repo2,使用逗号分隔多个远程仓库。
4. <mirrorOf>*,!repo1</miiroOf>
匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。
需要注意的是,由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定或者停止服务的时候,Maven仍将无法访问被镜像仓库,因而将无法下载构件。
生命周期和插件
- 生命周期功能由插件提供,生命周期和插件协同一起工作
- 阶段:清理、初始化、编译、测试、打包、集成测试、验证、部署、站点生成
- 三套生命周期:clean、default、site『建立项目站点』
描述插件
- mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1
- mvn help:describe -Dplugin=compiler
- mvn help:describe -Dplugin=compiler -Dgoal=compile
- mvn help:describe -Dplugin=compiler -Ddetail
可以用插件前缀来简化mvn命令的调用
Maven常用命令
mvn archetype:create #创建maven工程
mvn compile #编译源代码
mvn test-compile #编译测试代码
mvn test #运行应用程序的单元测试
mvn site #生成工程相关信息站点
mvn clean #清楚目标目录中的生成结果
mvn package #打包,比如生成jar
mvn install #打包并安装到本地仓库
mvn install -Dmaven.test.skip=true #打包但不执行单元测试
mvn deploy #打包并部署到远程仓库
mvn eclipse:eclipse #生成eclipse项目文件
mvn eclipse:clean #清除eclipse相关的文件
聚合与继承
聚合
- 一般聚合项目用<packaging>pom</packaging>
- 聚合项目与子项目平行目录结构的配置
<modules>
<module>../subModule1</module>
<module>../subModule2</module>
</modules>
继承
<perent>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<relativePath></relativePath>
</parent>
父模块dependencyManagement中定义的依赖:不会为父模块和子模块实际依赖,必须在子模块定义实际定义才行,而dependencies会导致父模块和所有子模块的依赖不必要的资源;pluginManagement和plugins有相同的道理
可以被继承的元素
- groupId:项目组ID,项目坐标的核心元素
- version:项目版本,项目坐标的核心因素
- description:项目的描述信息
- organization:项目的组织信息
- inceptionYear:项目的创始年份
- url:项目的URL地址
- developers:项目的开发者信息
- contributors:项目的贡献者信息
- distributionManagement:项目的部署配置
- issueManagement:项目的缺陷跟踪系统信息
- ciManagement:项目的持续集成系统信息
- scm:项目的版本控制系统信息
- malilingLists:项目的邮件列表信息
- properties:自定义的Maven属性
- dependencies:项目的依赖配置
- dependencyManagement:项目的依赖管理配置
- repositories:项目的仓库配置
- build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
- reporting:包括项目的报告输出目录配置、报告插件配置等
裁剪mvn构建的模块
- -am,–also-make:同时构建所列模块的依赖模块
- -amd,-also-make-dependents:同时构建依赖于所列模块的模块
- -pl,–projects:构建指定的模块,模块间用逗号分隔
- -rf,-resume-from:在完整的反应堆构建顺序基础上指定从哪个模块开始构建
作用:在开发过程中,灵活应用上述4个参数,可以帮助我们跳过那些无须构建的项目模块,从而加速构建,当项目庞大,模块特别多的时候,这种效果就异常明显。