Maven学习总结
Maven概念
Maven是一种基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。ps:个人使用心得,maven使用起来最方便的就是管理jar文件。
Maven安装
下载maven,配置环境变量,可通过mvn -v来测试maven安装是否成功。
Maven安装文件的目录结构:
bin目录包含mvn的运行脚本,
boot目录包含一个类加载器框架,
conf目录包含配置文件,
lib目录包含所需要的类库
Maven安装时的注意事项:
1、在目录中创建一个maven文件夹(我创建在E:/java/maven),将maven安装文件中的setting.xml(在conf文件夹下)拷贝过来,目的是转移工厂到自己的位置中,默认是我的文档/.m2/repository,修改setting.xml加入自己的路径:1
<localResositoty>E:/java/maven</localResositoty>
同时将安装文件中的setting.xml也加入此段配置代码。
2、知道中央工厂所在的位置,在lib文件下的maven-model-builder.jar文件中。
maven常用的构建命令:
mvn -v 查看maven版本
mvn compile 编译
mvn test 测试
mvn package 打包
mvn clean 删除maven在target中所生成的字节码文件
mvn install 安装jar包到本地仓库中
创建目录的两种方式:
1、archetype:generate 按照提示进行选择
2、archetype:generate -Dgroup=组织名
-DartifactId=项目名-模块名
-Dversion=版本号
-Dpackage= 代码所在的包名
maven声明周期:clean清理项目、default构建项目、site生成项目站点
在eclipse中创建maven项目
1、下载并正确安装eclipse;
2、在eclipse上成功安装maven插件;
3、成功安装插件后,在eclipse上File/New/Other、选择Maven项目。
maven项目约定好的目录结构:1
2
3
4
5
6
7
8
9
10src
main
Java
package 放置主代码
test
Java
package 放置测试代码
resource
这里解释一下以上文件夹
src/main/java
该文件夹是存放java源码的,发布项目时会将该文件夹下的class文件复制到WEB-INF/classes目录下
src/main/resources
该文件夹一般放置配置文件,如xml,properties文件等,其实也可以放置java文件,只是一种约定罢了,发布项目时该文件夹的文件也会复制到WEB-INF/class中
test中放置测试代码
pom.xml
常用标签概览:
pom.xml是maven项目的核心管理文件,用于项目描述、组织管理、依赖管理、构建管理,其中包含了很多标签。首先概览一下pom.xml中的标签:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20<project>
<modelVersion>4.0.0</modelVersion>
<!--maven2.0必须是这样写,现在是maven2唯一支持的版本-->
<!-- 基础设置 -->
<modelVersion>4.0.0</modelVersion> 指定了当前pom的版本
<groupId>cn.itcast.hadoop.mr</groupId> 用来指定当前的maven属于哪个实际的项目
<artifactId>datacount</artifactId>
<version>0.0.1-SNAPSHOT</version> 当前项目的版本号
<packaging></packaging> 打包方式,默认是jar
<name></name>项目描述名
<url></url>项目的地址
<description></description>项目描述
<name>...</name>
<dependencies>...</dependencies> 项目的依赖
<parent>...</parent> 被继承的父项目的构件
<dependencyManagement>...</dependencyManagement> 缺省的依赖信息将会从这个元素中继承
<modules>...</modules> 模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径
<properties>...</properties> 以值替代名称,Properties可以在整个POM中使用,也可以作为触发条件
Maven的依赖
在pom.xml中,使用如下标签配置依赖:1
2
3
4
5
6
7
8<dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
1 | groupId,必选,实际隶属项目 |
其中scope有六个值:
- compile:默认的范围,编译测试运行都有效
- provided:在编译测试时有效,在运行时没有效
- test:只在测试时有效
- runtime:在测试和运行时有效
- system:与本机系统相关联,可移植性差
- import:导入的范围,它只使用在dependencyManagement中,表示从其它的pom中导入dependency的配置。
依赖具有传递性,如果想取消传递依赖,可以进行依赖排除,使用exclusion标签。1
2
3
4
5
6
7
8
9
10
11<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.1</version>
<exclusions>
<exclusion>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
</exclusion>
</exclusions>
</dependency>
当依赖有冲突时会采用以下原则:
1、短路优先,优先解析路径短的,
2、先声明先优先,如果路径相同,谁先声明先解析谁。
Maven的聚合和继承
聚合
为了能够使用一条命令就能构建m1和m2两个模块,我们需要建立一个额外的名为m的模块,然后通过该模块构建整个项目的所有模块。m本身也是个Maven项目,它的POM如下:1
2
3
4
5
6
7
8
9
10
11
12<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.zju.test</groupId>
<artifactId>m</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging> pom </packaging>
<name>Account Aggregator</name>
<modules>
<module>m1</module>
<module>m2</module>
</modules>
</project>
继承
可声明父POM供子POM继承
父模块POM如下:1
2
3
4
5
6
7
8<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.zju.test</groupId>
<artifactId> m-parent </artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name> M Parent</name>
</project>
子模块声明继承如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14<project>
<modelVersion>4.0.0</modelVersion>
< parent >
<groupId>com.zju.test</groupId>
<artifactId> m-parent </artifactId>
<version>1.0.0-SNAPSHOT</version>
< relativePath >../m-parent/pom.xml</ relativePath>
</ parent >
<artifactId> m-child </artifactId>
<name>m child</name>
...
</project>
最后,同样还需要把m-parent加入到聚合模块m中。聚合的POM如下:1
2
3
4
5
6
7
8
9
10
11
12<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.zju.test</groupId>
<artifactId>m</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging> pom </packaging>
<name>M</name>
<modules>
<module>m-child</module>
<module>m-parent</module>
</modules>
</project>
注意:
- 子模块没有声明groupId和version, 这两个属性继承至父模块。但如果子模块有不同与父模块的 groupId、version ,也可指定;
- 不应该继承artifactId,如果groupId ,version,artifactId 完全继承的话会造成坐标冲突;另外即使使用不同的 groupId或version,同样的 artifactId也容易产生混淆。
- 使用继承后 parent也必须像自模块一样加入到聚合模块中。也就是在在聚合模块的 pom中加入
m-parent Maven插件
未完待续…