007-Maven

简介

Maven项目对象模型(POM、Project Object Model),主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。Maven的核心功能便是合理叙述项目间的依赖关系。

项目构建

理想的项目构建是高度自动化,跨平台,可重用的组件,标准化的,使用maven就可以帮我们完成上述所说的项目构建过程。
beba4f840861d2b94f35c55461dd29b9

依赖管理

假如正在开发项目A和B,A依赖于B中的某些类,那么如何维系这种依赖关系呢?未使用Maven前,一般将B打包为jar,并在A的Library下导入B的jar文件。手动控制项目依赖的缺点:如果修复了B中的bug,要么选择将B打包导入A中,要么将B发布出去并告知开发者使用方法。这样效率低下且存在人为失误。

依赖管理指使用Maven来管理项目中使用到的jar包,Maven管理的方式就是:自动下载项目所需要的jar包,统一管理jar包之间的依赖关系。

Maven安装

安装Maven需安装好jdk 1.6+版本,并配置好JAVA环境变量
Maven下载链接,安装完目录结果如下
f4cf829f1813d007525615bfcfbbc382
目录分析

  • bin:含有mvn运行的脚本

  • boot:含有plexus-classworlds类加载器框架

  • conf:含有settings.xml配置文件

  • lib:含有Maven运行时所需要的java类库

  • LICENSE.txt, NOTICE.txt, README.txt针对Maven版本,第三方软件等简要介绍

    配置环境变量

    MAVEN_HOME
    7554407ca6fc87b1f92a985a01bf85dc
    Path
    405a012a4fb3262de62418276469f099
    打开cmd窗口,输入mvn –v命令,能查看到Maven的相关信息,说明已经安装成功
    69978d07d4e085d56f0026c018a730ec

    IDEA创建Maven项目

    Tips:IDEA内置了maven
    9234c624c51e5bac70aa6a564bed986f
    ba2288f0e320c19cdfaa4670fd076f69

  • GroupID:是项目组织唯一的标识符,是main目录里java的目录结构。按照约定规范举例:com即为项目域名后缀,假设公司为co,项目为webapp,groupId就为:com.co.webapp

  • ArtifactID:是项目的唯一的标识符,实际对应项目的名称,也就是项目根目录的名称。

  • Version:指定了项目的当前版本,SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本。
    42a6d51dcd498ae201a21a1c0c153318
    53179649bbad1d3b269aa0ecb949a5be
    创建完项目,我们一般会手动在java包下根据GroupID建立对应路径
    0e13193af1f1843ab4e0ea11ecc67bb5

    POM文件

    所有的Maven项目包含着一个名为pom.xml的文件,文件中记录着自身的等字段,这些字段在创建Maven项目时填写,Maven会依据它们来确定着项目唯一版本,另一个关键标签是,该标签下可以包含若干个标签,用来声明依赖关系。
    如:我们要添加JUNIT的jar包,可以到Maven远程中心仓库搜索JUNIT
    0d23fd092e9be20ec7363911809ffedc
    点击选择其中一个版本
    11ac912c20a7f192cfddf20b94fcc20c
    91eeef3490d0f5abe75434d3dcf5c3f7
    复制Maven框中的内容,把它们复制到pom的下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.co.webapp</groupId>
    <artifactId>webapp</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
    <!-- https://mvnrepository.com/artifact/junit/junit -->
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
    </dependency>
    </dependencies>
    </project>

点击同步后,就可以在Dependencies下看到下载到本地仓库的插件
892d6271b380f95b18a0c3fa1b7e562e

POM常用标签

maven下载依赖时,依次读取三个配置文件,分别是项目下的pom.xml 文件 、用户目录下的.m2/settings.xml 与 maven 全局配置settings.xml
三者的级先是 pom.xml > /home_dir/.m2/settings.xml > /maven_dir/conf/settings.xml 。pom仅作用于本项目,用户setting作用于调用了此文件的项目,全局setting作用于所有项目

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<?xml version="1.0" encoding="UTF-8"?>
<!--project是根元素,通过其属性引入命名空间和schema文件-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--parent元素用于引入父项目坐标-->
<!--若本项目中没有显示规定某个元素的值,则使用父项目中的对应值-->
<parent>
<artifactId>csb2-parent</artifactId>
<groupId>com.cvte.csb</groupId>
<version>2.0.3</version>
<!--relativePath元素指定父项目pom.xml文件的相对路径-->
<!--默认值是"../pom.xml",允许你指定一个不同的路径-->
<!--Maven在构建当前项目时,首先从当前项目寻找父项目pom文件-->
<!--如果不存在则relativePath路径下寻找-->
<!--如果还不存在,则在本地仓库寻找-->
<!--依然没找到的话,就在远程仓库寻找父项目pom文件-->
<relativePath/>
</parent>

<!--POM版本号-->
<modelVersion>4.0.0</modelVersion>

<!--本项目标识符和版本信息-->
<groupId>com.co.webapp</groupId>
<artifactId>webapp</artifactId>
<version>1.0-SNAPSHOT</version>

<!-- 声明构建时使用的编码,一般本地Maven编码为GBK,与项目UTF-8不符会报错 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<!--本项目坐标三元组-->
<!--项目产生的构件类型,例如jar、war、ear、pom-->
<packaging>jar</packaging>
<!--项目名称-->
<name>webapp</name>
<!-- 项目的详细描述-->
<description>Maven test project</description>

<!--dependencies元素用于指定项目相关依赖-->
<dependencies>
<dependency>
<!--依赖项的坐标三元组-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!--依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来
- compile :默认范围,用于编译
- provided :类似于编译,但支持你期待jdk或者容器提供,类似于classpath
- runtime : 在执行时需要使用
- test : 用于test任务时使用
- system : 需要外在提供相应的元素。通过systemPath来取得
- systemPath: 仅用于范围为system。提供相应的路径
- optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用-->
<scope>test</scope>
<!--当计算传递依赖时,列出被排除的依赖构件集,主要用于解决版本冲突问题-->
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

<!--dependencyManagement用于所依赖jar包进行版本管理的管理器-->
<!--如果dependencies里没有声明version元素,就使用dependencyManagement里面对应的version元素,如果有就继承它,如果没有就会报错-->
<!--如果dependencies中声明了version,优先以dependency里的version为准-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
</dependencyManagement>

<!-- 插件 -->
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
</configuration>
<dependencies>
<!-- 依赖的驱动 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>

<!-- 指定jar包上传的仓库 -->
<distributionManagement>
<repository>
<id>Zts_repository</id>
<name>test repository</name>
<url>http://localhost:8081/repository/Zts_repository/</url>
</repository>
</distributionManagement>
</project>

仓库概念

仓库分为:本地仓库、第三方仓库(私服)、中央仓库

  • 本地仓库:Maven会将工程中依赖的构件(Jar包)从远程下载到本机一个目录下,默认的仓库是在:$user.home/.m2/repository,如:C:\Users\ZTS.m2\repository
  • 第三方仓库:又称为内部中心仓库,也称为私服,一般是由公司自己设立的,只为本公司内部共享使用。它既可以作为公司内部构件协作和存档,也可作为公用类库镜像缓存,减少在外部访问和下载的频率。私服可以使用的是局域网,所以一般公司都会创建这种第三方仓库,保证项目开发时,项目所需用的jar都从该仓库中拿,每个人的版本就都一样。
  • 远程中心仓库:Maven内置了远程公用仓库:http://repo1.maven.org/maven2 ,这个公共仓库是由Maven自己维护,里面有大量的常用类库,并包含了世界上大部分流行的开源项目构件。工程依赖的jar包如果本地仓库没有,默认从中央仓库下载

命令

假设已经用IDEA创建了MAVEN项目,我们同时写了两个类用于测试,打开CMD命令行,进入项目根目录就可以执行Maven命令了
ac81608d932595828052c37da33db41f

编译

编译时会跟据POM文件声明的依赖,自动下载各种依赖的jar包,编译成功后根目录多了一个target文件夹,目录下多了.class文件

1
mvn compile

67b7905d30c6f3c786069a4b0a07b217

清理

删除编译项目时生成的target文件夹

1
mvn clean

测试

Maven先帮我们编译项目,然后再执行测试代码,生成了的target文件夹里面有classes和test-classes

1
mvn test

a06626547abafd41b010ba794eec929f

打包

打包成功之后,可以看到项目根目录下的target文件夹下生成了一个webapp-1.0-SNAPSHOT.jar 的jar包

1
mvn package

安装

安装实际对项目做了清理、编译、测试、打包,再把打包好的jar和相关的依赖声明放到本地仓库中

1
mvn install

1486cfc66083cdd3583ddac2a8dc6597
e5ebc270f0216c5a9c7c8d2d7a7471a3
Tips:Maven3不提供oracle JDBC driver,如果需要用到ojdbc,则需要自己下载jar。CMD命令行切换jar包所在目录,执行下面命令将jar安装到仓库

1
mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0 -Dpackaging=jar -Dfile=ojdbc6-11.2.0.jar

部署&调用

详见008-Nexus