maven学习笔记
1、依赖范围:compile,test,provided,runtime,system
2、传递性依赖:A依赖于B,B依赖于C,则A间接依赖于C,A的依赖范围受B和C影响
3、依赖调节原则:当依赖jar包产生重复冲突时,下载jar包路径最近者优先,第一声明者优先
4、可选依赖不会被传递,<optional>true</optional>
5、面向对象设计:单一职责性原则,一个类应该只有一项职责,而不是糅合多个功能;规划maven项目也是如此
6、排除依赖<exclusions><exclusions>...</exclusion></exclusions>
7、maven属性归类依赖:
<properties><springframework.version>2.5.6</springframework.version></properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${springframework.version}</version>
</dependency>
</dependencies>
8、maven仓库布局路径:groupId/artifactId/version/artifactId-version.packaging
9、maven仓库分为本地仓库和远程仓库;远程仓库主要有maven核心自带的中央仓库,以及私有仓库服务器(私服);可以有多个远程仓库,但是只有一个本地仓库;releases和snapshots元素设置发布版构件和快照版构件的下载;设置本地仓库地址使用localRepository元素,设置远程仓库地址:
<repositories>
<repository>
...
</repository>
</repositories>
10、默认仓库目录在.m2/repository下,配置文件settings.xml;
远程仓库认证信息放在settings.xml里面:
<servers>
<server>
<id>...</id>
<username>...</username>
<password>...</password>
</server>
</servers>
11、maven生命周期:clean、default和site
12、maven生命周期和插件互相绑定,完成具体构建任务。maven通过绑定插件完成实际任务。插件仓库:
<pluginRepositories>
<pluginRepository>
<id><name><url><layout>...
</pluginRepository>
</pluginRepositories>
13、maven的聚合特性是为了把项目多个模块一起构建,maven的继承特性则是为了抽取模块中相同的依赖和插件等配置。
聚合中父模块依赖:
<modules>
<module>account-email</module>
<module>account-persist</module>
</modules>
父模块只有pom文件和目录结构,没有src等文件结构;
聚合可以使用父子关系目录结构,平行目录结构;
继承是指子模块继承父模块依赖等配置。
<parent>
<groupId><artifactId><version><relativePath>...
</parent>
14、依赖管理
父模块中:
<dependencyManagement>
<dependencies>...</dependencies>
</dependencyManagement>
可以在父模块中声明依赖版本,子模块中省略版本就可以引入相关依赖,不添加父模块中依赖就不会引入多余依赖。
15、插件管理
父模块中:
<pluginManagement>
<plugins>
...
</plugin>
</pluginManagement>
16、maven默认的清除构建目录,创建目录,编译代码,复制依赖到目标目录,最后打包流程。源码默认目录为src/main/java,编译输出target/classes/,打包方式为jar,包输出目录为target//
17、反应堆:模块构建顺序
18、maven使用约定优于配置
19、Nexus:Maven仓库管理软件(可以下载war包在tomcat里面运行,自己搭建私服)
Nexus内置仓库:group(仓库组),hosted(宿主),proxy(代理)和virtual(虚拟)
使用镜像让maven只使用私服下载依赖包
<mirrors>
<mirror>
<id>...</id>
<name>...</name>
<url>...</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
20、使用maven进行测试:
maven-surefire-plugin测试插件
动态指定运行单元测试的类:$mvn test -Dtest=RandomTest
21、生成测试报告:maven有基本的测试报告,TestNG框架测试报告,JUnit框架也可以打印出测试报告
22、重用测试代码:maven-jar-plugin插件打包测试代码重复使用
23、使用jetty-maven-plugin进行单元测试
24、插件实现自动化热部署
25、Cargo实现自动化部署,可以部署到本地web容器和远程web容器
26、<build>标签管理构建项目:
<resources>管理资源
<pluginManagement>:父模块中定义详细参数,子模块引用
<plugins>给出构建过程中所用到的插件
<extensions>是执行构建过程中可能用到的其他工具,在执行构建的过程中被加入到classpath中。
也可以通过<extensions>激活构建插件,从而改变构建的过程。
通常,通过<extensions>给出通用插件的一个具体实现,用于构建过程。
27、profiles里面的<build>
28、上传插件到远程仓库:
<distributionManagement>
<repository>
<id>x.x.x</id>
<url>http://.../repository/maven-releases/</url>
</repository>
</distributionManagement>
29、<mirror>镜像配置:
<mirrors>
<mirror>
<id>maven-net-cn</id>
<name>Maven China Mirror</name>
<url>http://maven.net.cn/content/groups/public/</url>
<mirrorOf>central</mirrorOf>//使用maven-net-cn覆盖了Maven自带的central
</mirror>
</mirrors>
<mirrorOf>*</mirrorOf>覆盖所有,成为唯一仓库
30、<pluginRepositories>标签:配置maven插件的远程仓库,插件打包时需要远程下载的依赖
<pluginRepositories>
<pluginRepository>
<id>maven.aliyun.com</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
31、settings.xml文件配置远程仓库:
<repositories>
<repository>
<id>nexus</id>
<name>Nexus Repository</name>
<url>远程仓库地址</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled> <!--snapshots默认是关闭的,需要开启 -->
</snapshots>
</repository>
</repositories>
重难点:
1、<packaging>pom</packaging>
maven项目的打包类型:pom、jar、war
packing默认是jar类型,
pom是最简单打包类型,是为了传递依赖或者聚合工程而使用的。多项目中父项目都为pom类型。
<modelVersion>4.0.0</modelVersion>
<groupId>com</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>xxx</module>
</modules>
2、maven加载配置文件顺序:
settings.xml是maven的全局配置文件。而pom.xml文件是所在项目的局部配置
settings.xml文件一般存在于两个位置:
全局配置: ${M2_HOME}/conf/settings.xml
用户配置: user.home/.m2/settings.xml
用户配置优先于全局配置。
局部配置优先于全局配置。配置优先级从高到低:pom.xml> user settings > global settings
如果这些文件同时存在,在应用配置时,会合并它们的内容,如果有重复的配置,优先级高的配置会覆盖优先级低的。
3、repository和mirror的区别
如果setting.xml和pom里都配置了repository, 配置的mirror是可以对两个配置文件都生效。与repository不同,配置到同一个repository的多个mirror时,相互之间是备份的关系,只有在仓库连不上的时候才会切换另一个,而如果在能连上的情况下找不到包,是不会尝试下一个地址的。
配置多个repository时maven会按照配置从上到下的顺序,依次尝试从各个地址下载,成功下载为止。
maven里的mirror和repository是两个比较容易混淆的概念,它们的作用都是配置远程maven仓库的地址。顾名思义,repository就是直接配置站点地址,mirror则是作为站点的镜像,代理某个或某几个站点的请求,实现对repository的完全代替。
mirror相当于一个拦截器,它会拦截maven对remote repository的相关请求,把请求里的remote repository地址,重定向到mirror里配置的地址。
<mirrorOf></mirrorOf>标签里面放置的是要被镜像的Repository ID。为了满足一些复杂的需求,Maven还支持更高级的镜像配置:
<mirrorOf>*</mirrorOf> 匹配所有远程仓库。
<mirrorOf>repo1,repo2</mirrorOf> 匹配仓库repo1和repo2,使用逗号分隔多个远程仓库。
<mirrorOf>*,!repo1</miiroOf> 匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。
如果该镜像仓库需要认证,则配置setting.xml中的<server></server>即可。
mirror,server,repository怎么配置才合适!!!
优先配置pom.xml中repository,优先配置去私服下载,再去阿里云下载。
需要上传jar时才配置server。
settings.xml中mirror可以不配置,多个仓库地址切换时可以用profile。
4、server配置
server认证用户名密码,server中id和repository.id保持一致。一般在在pom.xml文件中的repositories和distributionManagement元素中定义
5、maven获取jar顺序:本地仓库获取-远程仓库(公司的私服)获取-中央仓库(阿里云镜像)获取