zhouzhaoxin
zhouzhaoxin 主攻python,喜欢读书,喜欢摄影,芒格的忠实追随者。关注各个领域发展,取长补短,擅长结合多学科技术解决问题

Maven配置解析与依赖传递

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项目实例

  1. 打开Eclipse

  2. 创建Maven项目,选择archetype-webapp模板

  3. 解决Servlet没有生命依赖的问题,在pom.xml中添加servlet的依赖,可以去中央仓库选择servlet版本 例如: ```xml

javax.servlet javax.servlet-api 4.0.0-b01
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>