Maven配置解析与依赖传递

Maven的核心配置文件pom.xml的解析与其依赖传递特性,并简单介绍Maven在Web开发中的配置操作过程
1
2
Maven安装本地jar备忘
mvn install:install-file -Dfile=jar包的位置 -DgroupId=上面的groupId -DartifactId=上面的artifactId -Dversion=上面的version -Dpackaging=jar
pom.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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<name>项目的描述名</name>
<url>项目的地址</url>
<description>项目描述</description>
<developers>开发人员信息</developers>
<licenses>许可证信息</licenses>
<!-- 依赖列表 -->
<dependencies>
<!-- 依赖项 -->
<dependency>
<!--指定坐标-->
<groupId>反写公司网址+项目名</groupId>
<artifactId>项目名+模块名</artifactId>
<version>版本0.0.0(大版本+分支版本+小版本)</version>
<type>类型</type>
<scope>依赖的范围</scope>
<optional>设置依赖是否可选,默认是false</optional>
<!-- 排除依赖传递列表 -->
<exclusions>
<exclusion></exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- 依赖的管理,一般定义在父模块中,由子模块去继承 -->
<dependencyManagement>
<dependencies>
<dependency></dependency>
</dependencies>
</dependencyManagement>
<!-- 对构建行为提供相应的支持 -->
<build>
<!-- 插件列表 -->
<plugins>
<plugin>
<!-- 指定坐标 -->
<groupId>反写公司网址+项目名</groupId>
<artifactId>项目名+模块名</artifactId>
<version>版本0.0.0(大版本+分支版本+小版本)</version>
</plugin>
</plugins>
</build>
<!-- 一般在子模块中指定所继承的父模块 -->
<!-- 继承后拥有父模块的特性 -->
<parent></parent>
<!-- 模块列表 -->
<modules>
<module></module>
</modules>
<!--作用域-->
<scope>
<!--
scope作用域简介
1.compile:默认范围,编译测试运行都有效
2.provided:在编译和测试时有效
3.runtime:在测试和运行时有效
4.test:只在测试时有效
5.system:在编译和测试时有效,与本机系统关联,可移植性差
6.import:导入的范围,它只使用在dependencyManagement中,表示从其他的pom中导入dependency的配置
-->
Maven依赖传递
假设B项目依赖A项目,C项目又依赖B项目,那么在C项目中运行compile时,在引进B项目的同时,自动就把A项目也引进来了。如果不想将A项目导入的话,可以使用exclusions下设置exclusion,然后将A项目的坐标添加即可。
Ps:可以在settings.xml中的profile结点,来更改默认的Maven使用的jdk版本,否则将显示默认的1.5版本。
1
2
3
4
5
6
7
8
9
10
11
12
<profile>
<id>jdk-1.7</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.7</jdk>
</activation>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>
</properties>
</profile>
依赖冲突
如果A和B依赖了一个不同版本的相同的构件C。
如果A和B依赖了一个不同版本的相同的构件C。
会优先解析路径短的版本。 A -> B -> C -> X(jar) A -> D -> X(jar) 优先解析短的
先声明先优先
如果路径长度相同,则谁先声明,先解析谁。
聚合
如果项目D依赖项目C,项目C依赖项目B,项目B依赖项目A,我们需要一个个安装这项项目,在Maven中有一种方式可以将多个项目一次性安装,这就是聚合的概念。
简单讲就是,需要人工多次操作的,只要Maven能理解,一次性告诉他,他就能帮我们做这件单调烦人的事情了。
使用
继承
多次使用到的依赖,比如:单元测试,没有必要在所有的项目中都引用一下,此时就可以采用继承的方式来实现,先来一个父级的POM.XML然后再继承此POM.XML。使用
Maven 配置web项目实例
-
打开Eclipse
-
创建Maven项目,选择archetype-webapp模板
-
解决Servlet没有生命依赖的问题,在pom.xml中添加servlet的依赖,可以去中央仓库选择servlet版本 例如: ```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
34
35
36
37
38
39
4. 手工完善Maven约定好的目录结构
可以在navigator窗口中手动新建
../src/main/java
../src/test/java
5. Project Explorer中更新项目
6. 创建项目的输出目录
build path中设置输出路径output folder,确保每个module都输出在../tartet/classes目录中
7. 将Maven项目转换为Web项目
右击-属性-project facets-勾选动态模板(Dynamic Web Module)
8. 修改部署时配置去掉多余的配置项例如:测试代码
右击-属性-Deployment Assembly-删除多余的配置项(测试代码)
9. 使用package命令打包项目—使用jetty这个插件(在Maven的中央插件库中寻找)作为Web容器,在中央仓库查找jetty的plugin坐标配置到pom.xml中
#### pom.xml例子
```xml
<build>
<finalName>webbproject-demo</finalName>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>