maven
maven资料
maven书籍和视频介绍:http://pan.baidu.com/s1hq00qLA
国外资料介绍、引导、书籍:http://www.tutorialspoint.com/maven/index.htm
maven官网:http://maven.apache.org/
简单知识点
-
maven是什么:java管理和构建工具,管理定义项目结构、项目依赖,用统一方式进行自动化构建
-
项目结构
-
构建流程:编译->测试->打包->发布(部署)
只需要服务器安装Tomcat在启动构建,就会自动执行:清理->编译->测试->报告->打包->部署,这样的一套流程
-
包管理:
- 旧有方式:一个项目下有一个lib,java包放入lib中,所以随着项目增多,java包也增长
- maven仓库管理:
- 多个项目共享同一个仓库,用仓库将java包和项目分离
- 依赖传递机制解决项目内java包之间的版本冲突
-
-
使用仓库的目的:将不同项目的java包统一管理(下载,配置,规则统一,包的版本管理)
-
配置maven配置文件D:\maven\maven3.1.1\conf\settings.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33<localRepository>D:/maven/my_local_repository</localRepository>
<mirrors>
<mirror>
<id>osc</id>
<mirrorOf>central</mirrorOf>
<url>http://maven.oschina.net/content/groups/public/</url>
</mirror>
<mirror>
<id>osc_thirdparty</id>
<mirrorOf>thirdparty</mirrorOf>
<url>http://maven.oschina.net/content/repositories/thirdparty/</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>osc</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>osc</id>
<url>http://maven.oschina.net/content/groups/public/</url>
<repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>osc</id>
<url>http://maven.oschina.net/content/groups/public/</url>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles> -
maven脚手架(模版)不用自己书写:http://docs.codehaus.org/display/MAVENUSER/Archetypes+List
-
maven命令行
- 创建项目:mvn archetype:generate
-
maven在IDEA中
-
maven项目结构规范
1
2
3
4
5
6
7
8
9
10
11-project <artifactId>
-src
-main 项目主体文件
-java 放.java文件
- 包名 <groupId>
-resources 除了.java文件都可以放在里面(例如.xml, property), 即配置文件,静态文件(.html,.css,.js, image图片等不需要java编译,模版页jsp)
-webapp
-test 单元测试文件Junit
-java 放.java文件
-resources 单元测试中需要用的配置文件
-pom.xml 标志着一个maven项目,maven配置文件 -
pom.xml
1 |
|
-
坐标
, , :三个坐标决定了jar包的位置,首先在本地仓库查找,没找到去镜像仓库寻找,找到了在拉取到本地仓库 - 项目:一个项目可以有多个模块,聚合maven项目,一个项目也可以就是一个工程没有模块
- 一项目即一个工程时命名规则
- groupId: 组织域名逆序 例如com.baidu
- artifactId: 项目名 例如OA, hello
- version: 1.0-SNAPSHOT, 1.0-release
- 一项目包含多个模块时命名规则,例如OA项目包含前端、后端、common三个模块
- groupId: 组织域名+项目名逆序 例如com.baidu.oa
- artifactId: 模块名 例如前端模块, 后端模块,common模块
- version: 1.0-SNAPSHOT, 1.0-release
-
依赖
:如何通过坐标信息引用其他jar包,也称为引用依赖,去中央仓库找依赖https://mvnrepository.com -
属性变量
: 设置编译器的jdk版本,编码方式,依赖版本,可以统一管理版本的地方 -
依赖范围
: - compile:编译、测试、打包、运行都需要依赖包
- test:测试、运行需要依赖包
- runtime:运行、测试需要依赖包
- provided:编译、测试、运行需要依赖包
- import: 只能用在
,用于继承父依赖中的多个依赖
|范围|编译|测试|运行|打包|使用场景|
| -----|-----|-----|-----|-----|-----|
|compile|$\checkmark$|$\checkmark$|$\checkmark$|$\checkmark$|默认|
|test||$\checkmark$|||测试功能|
|runtime||$\checkmark$|$\checkmark$||反射,运行时加载包|
|provided|$\checkmark$|$\checkmark$|$\checkmark$||部署的服务器提供了该依赖|
|system|$\checkmark$|$\checkmark$|$\checkmark$||引用本地物理路径jar包,元素用于制定本地系统中 jar 文件的路径|
|import|||||继承其他包的所有依赖|
-
: 是否传递依赖,默认false代表会传递依赖
非pom.xml的手动打包流程
使用Lifecycle可以分阶段完成部分生命周期,注:双击某个周期阶段,则该阶段之前的周期阶段都会执行
- clean: 清除生成的target目录,缓存内容。
- compile: 编译代码
- test: 测试test目录中的代码
- package: 生成.jar或者.war
- install: 将生成的.jar或者.war传到本地仓库
依赖传递
-
背景:B项目依赖mysql驱动,A项目依赖B项目
要求:- A项目需要依赖mysql驱动:B项目的mysql依赖范围
用compile,或者 用false。 - A项目不需要依赖mysql驱动:B项目的mysql依赖范围
用test,或者 用true。
- A项目需要依赖mysql驱动:B项目的mysql依赖范围
-
背景:A项目排除B项目的依赖,但是没法在B项目的pom.xlm中使用
可以在A项目中使用1
2
3
4
5
6
7
8
9
10
11
12
13
14
15A项目的pom.xml文件
<dependencies>
<dependency>
<groupId>B项目groupId</groupId>
<artifactId>B项目artifactId</artifactId>
<version>B项目version</version>
<exclusions>
<exclusion>
<groupId>B项目中的某个依赖groupId</groupId>
<artifactId>B项目中的某个依赖artifactId</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies> -
查看依赖路径
maven聚合
一个项目拆成了多个工程分别开发缺点
- 可能需要将idea窗口拆成多个来回切换
- 一个子工程依赖另一个子工程时,另一个子工程必须要先完成install生命周期
maven聚合使用一个总工程将各个模块工程汇聚起来,作为一个整体对应完整的项目。- 项目:整体
- 模块:部分
maven聚合项目
- 可以把src删掉,因为聚合项目通常只是管理子工程
- pom.xml中的
修改默认jar改成pom,代表不是一个具体的包 - 建子模块
- 在总工程中pom.xml中增加
管理子工程,可以在总工程中编译同时自动在管理的子工程中自动编译。
maven继承
- 背景:各子项目都需要同一个依赖,可以将该依赖放到总工程中,其他模块继承父项目
- 在总工程pom.xml中添加依赖
- 在子工程pom.xml中添加继承
, 取消自己的 和
1
2
3
4
5
6
7
8
9
10
11<parent>
<groupId>总工程groupId</groupId>
<artifactId>总工程artifactId</artifactId>
<version>总工程version</version>
</parent>
<!--
当采用继承方式groupId, version都会被继承自父maven
<groupId>子工程groupId</groupId>
<version>子工程version</version>
-->
<artifactId>子工程artifactId</artifactId> - 背景:父项目中的部分依赖是某些子项目不一定需要的,可以将可选依赖放到总工程
下,其他模块继承父项目 - 在总工程pom.xml中的
下添加依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<!-- 子工程必须需要的依赖 -->
<dependencies>
<dependency>
<groupId>必须的依赖groupId</groupId>
<artifactId>必须的依赖artifactId</artifactId>
<version>必须的依赖version</version>
</dependency>
</dependencies>
<!-- 子工程非必须需要的依赖 -->
<dependenceManagement>
<dependencies>
<dependency>
<groupId>非必须的依赖groupId</groupId>
<artifactId>非必须的依赖artifactId</artifactId>
<version>非必须的依赖version</version>
</dependency>
</dependencies>
</dependenceManagement>- 在子工程pom.xml中添加继承
, 取消自己的 和 ,添加在总工程 中需要的依赖,但是取消
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20<parent>
<groupId>总工程groupId</groupId>
<artifactId>总工程artifactId</artifactId>
<version>总工程version</version>
</parent>
<!--
当采用继承方式groupId, version都会被继承自父maven
<groupId>子工程groupId</groupId>
<version>子工程version</version>
-->
<artifactId>子工程artifactId</artifactId>
<dependencies>
<dependency>
<groupId>子工程需要的依赖groupId</groupId>
<artifactId>子工程需要的依赖artifactId</artifactId>
<!--
<version>子工程需要的依赖version</version>
-->
</dependency>
</dependencies> - 在总工程pom.xml中的