本文内容主要摘自:http://www.konghao.org/index 内部视频
http://www.ibm.com/developerworks/cn/java/j-lo-maven/
一、 简介:
1. 下载maven,配置path
2. 修改本地仓库位置,修改maven目录下的conf中的setting.xml,增加如下内容localRepository配置,例如:<localRepository>D:mavenRepository</localRepository>
3. maven 配置说明:
groupId: 当前Maven项目隶属的实际项目,可以是域名反向,一般用项目名称来表示
artifacId: 该元素定义实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目名-模块名称来表示
version: 当前版本
packaging:定义Maven项目的打包方式。首先,打包方式通常与所生成构件的文件扩展名对应。jar包和war包会使用不同的命令,当不定义packaging的时候,默认使用jar
4. 代码和资源存放位置:
源代码应该放置到src/main/java中
源代码的资源文件应该放置在src/main/resources文件夹中
测试代码应该放置到src/test/java中
测试代码的资源文件应该放置在src/test/resources文件夹中
5. mvn 常用命令:
mvn clean -->表示运行清理操作(会默认把target文件夹中的数据清理)
mvn clean compile-->表示先运行清理之后运行编译,会见代码编译到target文件夹中
mvn clean test-->运行清理和测试
mvn clean package-->运行清理和打包
mvn clean install-->运行清理和安装,会将打好的包安装到本地仓库中,以便其他的项目可以调用
mvn clean deploy-->运行清理和发布(发布到私服上面)
6. maven 项目生成方式:
1). mvn archetype generate可以自动完成这个骨架的建立
2). 使用eclipse开发maven项目
a). 配置本地自定义maven路径:
b). 右键 -- > new -- > maven project ,然后可以根据需求创建需要的maven项目
aa). 在New Maven Project 对话框中选择:create a simple project ,创建一个简单的项目,不包括项目目录。
bb). 下一步,catalog选择Internal 。Artifact Id 选择maven-archetype-quickstart创建一个简单的java项目,
选择maven-archetype-webapp创建一个简单的web项目。
The folder is already a source folder处理方式:右键build path -> configure build path -> source ,选择 src/main/java、src/test/java删除,然后再新建。
二、依赖
我们项目中依赖的 Jar 包可以通过依赖的方式引入,通过在 dependencies 元素下添加 dependency 子元素,可以声明一个或多个依赖。通过控制依赖的范围,
可以指定该依赖在什么阶段有效。
1. 依赖包的查询:
1). 所有的依赖都是通过坐标来进行存储的(GAV : groupId , artifactId , version )
2). 有一些网上的仓库提供了坐标的查询(http://mvnrepository.com/)
3). 通过<dependencies>设置依赖:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
maven是如何搜索依赖的?首先会在本地仓库查询如果本地仓库没有,就去中央仓库查询
2. 依赖会被传递:
A-->C B-->A ==> B-->C(这种依赖是基于compile这个范围进行传递)
对于依赖的传递而言,主要是针对compile作用域传递
3. 依赖传递的冲突问题:
1). a-->b1.0 c-->b1.1 d-->a和c,这个时候在d的pom中,哪一个依赖先写就使用先写依赖的版本,如果d--><d>a</d><d>c</d>-->依赖版本是b1.0
2). a-->b1.0 c-->b1.1 d-->a和c-->b1.0 f-->d,c,如果路径的长短不一致就选择最小路径 , f-->b1.1
3). 如果希望精确的控制依赖包,可以使用依赖的排除功能进行控制
4. 依赖的范围(scope声明):
1). test范围指的是测试范围内有效,在编译和打包的时候都不会使用这个依赖
2). compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去
3). provided依赖:在编译和测试的过程有效,最后生成war包时不会加入,诸如:servlet-api,因为servlet-api,tomcat等web服务器已经存在了,如果再打包会冲突
4). runtime在运行的时候依赖,在编译的时候不依赖
默认的依赖范围是compile
5. 聚合和继承:
1). 聚合:现实中一个项目往往是由多个 project 构成的,在进行构建时,我们当然不想针对多个 project 分别执行多次构建命令,这样极容易产生遗漏也会大大
降低效率。Maven 的聚合功能可以通过一个父模块将所有的要构建模块整合起来,将父模块的打包类型声明为 POM,通过 <modules> 将各模块集中到父
POM 中。其中 <module></module> 中间的内容为子模块工程名的相对路径。例如:
2). 继承:在面向对象的编程中我们学会了继承的概念,继承是可重用行即消除重复编码的行为。Maven 中继承的用意和面向对象编程中是一致的。
与聚合的实现类似,我们通过构建父模块将子模块共用的依赖,插件等进行统一声明,在聚合和继承同时使用时,我们可以用同一个父模块来完成这两个功能。
父文件:
子文件:
由于父模块只是用来声明一些可共用的配置和插件信息,所以它也像聚合模块一样只需要包括一个 POM 文件,其它的项目文件如 src/main/java 是不需要的。
聚合和继承存在一些共性和潜在的联系,在实际的应用中,经常将聚合模块的父模块和继承的父模块定义为同一个。并不是所有的 POM 元素都可以被继承,下图
是一个可继承的元素列表。
名称 | 描述 |
---|---|
groupId | 项目组 ID |
version | 项目版本 |
description | 描述信息 |
organization | 组织信息 |
inceptionYear | 创始年份 |
url | 项目的 url 地址 |
developers | 开发者 |
contributors | 贡献者信息 |
distributionManagerment | 部署信息 |
issueManagement | 缺陷跟踪系统 |
ciManagement | 持续继承信息 |
scm | 版本控制信息 |
mailingList | 邮件列表信息 |
properties | 自定义的属性 |
dependencies | 依赖配置 |
dependencyManagement | 依赖管理配置 |
repositories | 仓库配置 |
build | 源码目录,插件管理等配置 |
reporting | 报告配置 |
6. 版本管理:
总版本号.分支版本号.小版本号-里程碑版本
总版本号的变动一般表示框架的变动
分支版本号:一般表示增加了一些功能
小版本号:在分支版本上面进行bug的修复
里程碑:SNAPSHOT-->alpha-->beta-->release-->GA
user0.0.1-SNAPSHOT-->user0.0.1-Release--->user1.0.0SHAPSHOT -->user1.0.0-Rlease
-->user0.1.0-SNAPSHOT-->user0.1.0-Rlease
7. 去除依赖:
依赖是具有传递性的,例如 Project A 依赖于 Project B,B 依赖于 C,那么 B 对 C 的依赖关系也会传递给 A,如果我们不需要这种传递性依赖,也可以用 <optional>
去除这种依赖的传递
<dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> <optional>true<optional> </dependency>
假设第三方的 jar 包中没有使用 <optional> 来去除某些依赖的传递性,那么可以在当前的 POM 文件中使用 <exclusions> 元素声明排除依赖,exclusions 可以包含一个或者
多个 exclusion 子元素,因此可以排除一个或者多个传递性依赖。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency>