第1章 Maven 介绍

1.1 什么是 Maven

Maven 是一个项目管理工具,它包含了一个项目对象模型 (POM:Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

1.2 Maven 能解决什么问题

构建工程,管理 jar包,编译代码,自动运行单元测试,打包,生成报表,部署项目,生成 Web 站点

1.3 Maven 的两个精典作用

1.3.1 Maven 依赖管理

传统的 WEB 项目中,我们必须将工程所依赖的 jar 包复制到工程中,导致了工程的变得很大。那么maven 工程是如何使得工程变得很少呢?

maven 工程中不直接将 jar 包导入到工程中,而是通过在 pom.xml 文件中添加所需jar包的坐标,这样就很好的避免了 jar 直接引入进来,在需要用到 jar 包的时候,只要查找 pom.xml 文件,再通过 pom.xml 文件中的坐标,到一个专门用于”存放 jar 包的仓库”(maven 仓库)中根据坐标从而找到这些 jar 包,再把这些 jar 包拿去运行。

1.3.2 项目的一键构建

我们的项目,往往都要经历编译、测试、运行、打包、安装 ,部署等一系列过程。

什么是构建?
指的是项目从编译、测试、运行、打包、安装 ,部署整个过程都交给 maven 进行管理,这个过程称为构建。

一键构建
指的是整个构建过程,使用 maven 一个命令可以轻松完成整个工作

项目构建Maven - 图1

第2章 Maven的使用

2.1 Maven的下载

项目构建Maven - 图2

项目构建Maven - 图3

项目构建Maven - 图4

maven各个版本的下载:

http://archive.apache.org/dist/maven/

项目构建Maven - 图5

2.2 Maven 的安装

将Maven 解压到一个没有中文没有空格的路径下

项目构建Maven - 图6

bin:存放了 maven 的命令,比如我们前面用到的mvn tomcat:run
boot:存放了一些 maven 本身的引导程序,如类加载器等
conf:存放了 maven 的一些配置文件,如 setting.xml 文件
lib:存放了 maven 本身运行所需的一些 jar 包

2.3 JDK 的准备与统一

maven 软件就可以使用的前提是已经安装并配置好 JDK

JDK的安装与配置

2.4 Maven的配置

【计算机】右击-【属性】-【高级系统设置】

项目构建Maven - 图7

【环境变量】

项目构建Maven - 图8

【新建】

项目构建Maven - 图9

项目构建Maven - 图10

项目构建Maven - 图11

项目构建Maven - 图12

【win+r】-输入【cmd】

项目构建Maven - 图13

【mvn -v】检查 maven 是否安装成功

发现 maven 的版本,及 jdk 的版本符合要求,这样我们的 maven 软件安装就成功了

项目构建Maven - 图14

2.5 Maven 仓库

2.5.1 Maven 仓库的分类

  • 本地仓库 :用来存储从远程仓库或中央仓库下载的插件和 jar 包,项目使用一些插件或 jar 包。

  • 远程仓库:如果本地需要插件或者 jar 包,本地仓库没有,默认去远程仓库下载。
    远程仓库可以在互联网内也可以在局域网内。

    • 中央仓库 :在 maven 软件中内置一个 远程仓库地址 ,它是中央仓库,服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包含了世界上大部分流行的开源项目构件。
    • 其他远程仓库
    • 私服(私有服务器)

2.5.2 配置本地仓库:

修改 MAVEN_HOME/conf/settings.xml

项目构建Maven - 图15

项目构建Maven - 图16

2.5.3 配置mavne的阿里云下载镜像

修改 MAVEN_HOME/conf/settings.xml

  1. <mirrors>
  2. <mirror>
  3. <id>alimaven</id>
  4. <name>aliyun maven</name>
  5. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  6. <mirrorOf>central</mirrorOf>
  7. </mirror>
  8. </mirrors>

项目构建Maven - 图17

项目构建Maven - 图18

2.5.4 全局 setting 与用户 setting

maven 仓库地址、私服等配置信息需要在setting.xml 文件中配置,分为全局配置和用户配置。

在 maven 安装目录下的有 conf/setting.xml 文件,此 setting.xml 文件用于 maven 的所有 project项目,它作为maven 的全局配置。

如需要个性配置则需要在用户配置中设置,用户配置的 setting.xml 文件默认的位置在:{user.dir} /.m2/settings.xml 目录中, ${user.dir} 指windows 中的用户目录。

maven 会先找用户配置,如果找到则以用户配置文件为准,否则使用全局配置文件。

2.6 Maven 工程的认识

2.6.1 目录结构

项目构建Maven - 图19

项目构建Maven - 图20

2.6.2 运行

进入maven 工程目录(当前目录有pom.xml 文件),运行 tomcat:run 命令。

第3章 Maven 常用命令

我们可以在cmd 中通过一系列的maven 命令来对我们的maven-helloworld 工程进行编译、测试、运行、打包、安装、部署。

3.1. compile编译命令

正常项目

项目构建Maven - 图21

【win+r】 -【cmd】-【cd 项目路径】

项目构建Maven - 图22

出现【target】目录

项目构建Maven - 图23

【target】目录内容

项目构建Maven - 图24

编译成功!!!

项目构建Maven - 图25

3.2 test测试命令

项目构建Maven - 图26

3.3 clean清理命令

项目构建Maven - 图27

clean 是Maven 工程的清理命令,执行 clean 会删除target 目录及内容。

package 是maven 工程的打包命令,对于java 工程执行package 打成jar 包,对于web 工程打成war包。

项目构建Maven - 图28

【target】目录内容

项目构建Maven - 图29

为什么会生成war文件???

打开项目中的【pom.xml】文件

项目构建Maven - 图30

项目构建Maven - 图31

3.5 install安装命令

执行install 将maven 打成jar 包或 war 包发布到本地仓库。

从运行结果中,可以看出:当后面的命令执行时,前面的操作过程也都会自动执行,

项目构建Maven - 图32

【target】目录内容

项目构建Maven - 图33

项目构建Maven - 图34

3.6 Maven 指令的生命周期

maven 对项目构建过程分为三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:

  • Clean Lifecycle 在进行真正的构建之前进行一些清理工作。

  • Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。

  • Site Lifecycle 生成项目报告,站点,发布站点。

项目构建Maven - 图35

3.7 maven 的概念模型

项目构建Maven - 图36

Maven 包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

  • 项目对象模型 (Project Object Model)
    一个maven 工程都有一个pom.xml 文件,通过 pom.xml 文件定义项目的坐标、项目依赖、项目信息、插件目标等。

  • 依赖管理系统(Dependency Management System)
    通过maven 的依赖管理对项目所依赖的jar 包进行统一管理。

比如:项目依赖 junit4.9,通过在 pom.xml 中定义junit4.9 的依赖即使用junit4.9,如下所示是 junit4.9的依赖定义:

```

<!-- junit 的项目名称 -->
<groupId>junit</groupId>

<!-- junit 的模块名称 -->
<artifactId>junit</artifactId>

<!-- junit 版本 -->
<version>4.9</version>

<!-- 依赖范围:单元测试时使用junit -->
<scope>test</scope>




- 一个项目生命周期(Project Lifecycle)<br />
使用maven 完成项目的构建,项目构建包括:清理、编译、测试、部署等过程,maven 将这些过程规范为一个生命周期,如下所示是生命周期的各各阶段:

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven01.png#alt=)

maven 通过执行一些简单命令即可实现上边生命周期的各各过程,比如执行 mvn compile 执行编译、执行mvn clean 执行清理。

- 
一组标准集合
<br />maven 将整个项目管理过程定义一组标准,比如:通过maven 构建工程有标准的目录结构,有标准的生命周期阶段、依赖管理有标准的坐标定义等。

- 
插件(plugin)目标(goal)
<br />maven 管理项目生命周期过程都是基于插件完成的。


<a name="f0c9555e"></a>
# 第4章 maven项目

在实战的环境中,我们都会使用流行的工具来开发项目。

<a name="9cda0131"></a>
## 4.1  idea 的 maven 配置

<a name="cf89fa91"></a>
### 4.1.1配置maven

【File】-【Settings】

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven38.jpg#alt=Maven38)

每次创建项目时, IDEA 要使用插件进行创建,这些插件当你创建新的项目时,它每次都会去中央仓库下载,这样使得创建比较慢。应该创建时,让它找本地仓库中的插件进行创建项目。

-**DarchetypeCatalog=internal**

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven43.png#alt=Maven43)

<a name="e860bcf4"></a>
### 4.1.2 创建一个 maven工程

打开idea,选择创建一个新工程

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven39.jpg#alt=Maven39)

选择idea 提供好的maven 的web 工程模板

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven40.png#alt=Maven40)

【next】

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven41.png#alt=Maven41)

【finish】

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven42.png#alt=Maven42)

<a name="8dfb732a"></a>
### 4.1.3  idea 中创建一个 maven 的 web 工程

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven44.png#alt=Maven44)

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven45.png#alt=Maven45)

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven46.png#alt=Maven46)

补全框架

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven47.png#alt=Maven47)

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven48.png#alt=Maven48)

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven49.png#alt=Maven49)

<a name="81a7bc5c"></a>
## 4.2 eclipse 的maven配置

<a name="bfe10159"></a>
### 4.2.1 配置maven

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven51.png#alt=Maven51)

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven52.png#alt=Maven52)

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven53.png#alt=Maven53)

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven54.png#alt=Maven54)

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven55.png#alt=Maven55)

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven56.png#alt=Maven56)

<a name="2110d570"></a>
### 4.2.2 创建一个java工程

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven57.png#alt=Maven57)

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven58.png#alt=Maven58)

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven64.png#alt=Maven64)

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven59.png#alt=Maven59)

<a name="54aab353"></a>
### 4.1.3   创建一个 web 工程

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven57.png#alt=)

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven58.png#alt=)

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven60.png#alt=Maven60)

<a name="88bf85a9"></a>
### 4.1.4 创建maven Java 工程

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven57.png#alt=)

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven70.png#alt=Maven70)

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven71.png#alt=Maven71)

<a name="e24635e1"></a>
### 4.1.5 创建maven web 工程

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven57.png#alt=)

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven70.png#alt=)

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven72.png#alt=Maven72)

![](https://gitee.com/chulixuan/csdn-image/raw/master/MavenImg/Maven73.png#alt=Maven73)

<a name="be4cd287"></a>
# 第5章 依赖管理

<a name="fe0607fe"></a>
## 5.1 pom.xml依赖导入

[从网上下载依赖](https://mvnrepository.com/)

在 pom.xml 中定义坐标,内容包括:groupId、artifactId、version,详细内容如下:
cn.itcast.maven maven-first 0.0.1-SNAPSHOT :打包类型 jar:执行 package 会打成 jar 包 war:执行 package 会打成 war 包 pom :用于 maven 工程的继承,通常父工程设置为 pom pom.xml 是 Maven 项目的核心配置文件,位于每个工程的根目录,基本配置如下 :文件的根节点 . : pom.xml 使用的对象模型版本 :项目名称,一般写项目的域名 :模块名称,子项目名或模块名称 :产品的版本号 . :打包类型,一般有 jar、war、pom 等 :项目的显示名,常用于 Maven 生成的文档。 :项目描述,常用于 Maven 生成的文档 :项目依赖构件配置,配置项目依赖构件的坐标 :项目构建配置,配置编译、运行插件等 <?xml version=”1.0” encoding=”UTF-8”?> 4.0.0 org.example web 1.0-SNAPSHOT war javax.servlet servlet-api 2.5 provided <a name="7d331417"></a> ## 5.2 依赖范围 A 依赖 B,需要在 A 的 pom.xml 文件中添加 B 的坐标,添加坐标时需要指定依赖范围,依赖范围包括: - compile:编译范围,指 A 在编译时依赖 B,此范围为默认依赖范围。编译范围的依赖会用在编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。 - provided:provided 依赖只有在当JDK 或者一个容器已提供该依赖之后才使用, provided 依赖在编译和测试时需要,在运行时不需要,比如:servlet api 被tomcat 容器提供。 - runtime:runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如:jdbc 的驱动包。由于运行时需要所以runtime 范围的依赖会被打包。 - test:test 范围依赖 在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用, 比如:junit。由于运行时不需要所以test 范围依赖不会被打包。 - system:system 范围依赖与 provided 类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径,需要指定 systemPath 磁盘路径,system 依赖不推荐使用。 依赖范围由强到弱的顺序是:compile>provided>runtime>test | 依赖范围 | 对于编译classpath有效 | 对于测试classpath有效 | 对于运行时classpath有效 | 例子 | | --- | --- | --- | --- | --- | | compile | Y | Y | Y | spring-core | | test | - | Y | - | Junit | | provided | Y | Y | - | servlet-api | | runtime | - | Y | Y | JDBC驱动 | | system | Y | Y | - | 本地的,maven仓库之外的类库 | <a name="7f57d1b3"></a> ## 5.3 设置 jdk 编译版本 本教程使用jdk1.8,需要设置编译版本为 1.8,这里需要使用 maven 的插件来设置: 在pom.xml 中加入 org.apache.maven.plugins maven-compiler-plugin 1.8 1.8 UTF-8 <a name="ce91e958"></a> ## 5.4 设置tomcat org.apache.tomcat.maven common-tomcat-maven-plugin 2.2 8888 / <a name="873be346"></a> ## 5.5 什么是依赖传递 在maven中,依赖是可以传递的,假设存在三个项目,分别是项目A,项目B以及项目C。假设C依赖B,B依赖A,那么我们可以根据maven项目依赖的特征不难推出项目C也依赖A。 web项目直接依赖了spring-webmvc,而spring-webmvc依赖了sping-aop、spring-beans等。最终的结果就是在我们的web项目中间接依赖了spring-aop、spring-beans等。 <a name="9e2b6f34"></a> ## 5.6 依赖冲突 由于依赖传递现象的存在, spring-webmvc 依赖 spirng-beans-4.2.4,spring-aop 依赖 spring-beans-5.0.2,但是发现 spirng-beans-4.2.4 加入到了工程中,而我们希望 spring-beans-5.0.2 加入工程。这就造成了依赖冲突。 <a name="2ed50d25"></a> ## 5.7 如何解决依赖冲突 1. 使用maven提供的依赖调解原则 - 第一声明者优先原则 - 路径近者优先原则 2. 排除依赖 3. 锁定版本 <a name="53751ccd"></a> ### 第一声明者优先原则 在 pom 文件中定义依赖,以先声明的依赖为准。其实就是根据坐标导入的顺序来确定最终使用哪个传递过来的依赖。 <a name="dfb8f4fb"></a> ### 排除依赖 可以使用exclusions标签将传递过来的依赖排除出去。 org.springframework spring-web 5.3.0 org.springframework spring-beans <a name="e4b7db21"></a> ## 5.8 版本锁定 采用直接锁定版本的方法确定依赖jar包的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本为准添加到工程中,此方法在企业开发中经常使用。 版本锁定的使用方式: 第一步:在dependencyManagement标签中锁定依赖的版本 第二步:在dependencies标签中声明需要导入的maven坐标 ①在dependencyManagement标签中锁定依赖的版本 ②在dependencies标签中声明需要导入的maven坐标 org.springframework spring-web 5.3.0 pom文件中使用dependencyManagement标签进行依赖jar的版本锁定,并不会真正的将jar包导入到项目中,只是对这些jar版本进行锁定。项目中使用哪些jar包还需要在dependencies标签中进行声明 org.springframework spring-web 由于在前面已经在dependencyManagement标签中锁定了依赖jar包的版本,后面需要导入依赖是只需要指定groupId和artifactId,无需在指定version <a name="c00b6893"></a> # 第6章 分模块构建maven工程 <a name="08dc1156"></a> ## 6.1 maven工程的继承 - 在Java语言中,类之间是可以继承的,通过继承,子类就可以引用父类中非private的属性和方法。同样,在maven工程之间也可以继承,子工程继承父工程后,就可以使用在父工程中引入的依赖。继承的目的是为了消除重复代码。 - 被继承的maven工程通常称为父工程,父工程的打包方式必须为pom - 继承其他的maven父工程的工程通常称为子工程,在pom.xml文件通过parent标签进行父工程的继承 <a name="493e1a91"></a> ## 6.2 Maven 的工程类型 1. pom包工程:父工程,在父工程中定义依赖的jar包的版本信息,以及Maven 插件的版本 2. war包工程:web工程,可以直接放到tomcat下运行的工程 3. jar包工程:是pom工程的子工程,由pom工程来管理 <a name="8654cf9d"></a> ## 6.3 maven工程的聚合 在maven工程的pom.xml文件中可以使用`<modules>`标签将其他maven工程聚合到一起,聚合的目的是为了进行统一操作。 <?xml version=”1.0” encoding=”UTF-8”?> 4.0.0 org.example father 1.0-SNAPSHOT common dao service pom <a name="eee760fb"></a> ## 6.4 分模块构建maven工程具体实现 <a name="3e4f70ad"></a> ### 父工程maven_parent构建xml <?xml version=”1.0” encoding=”UTF-8”?> 4.0.0 com.itheima maven_parent 1.0-SNAPSHOT maven_pojo maven_service maven_dao maven_web pom 5.0.5.RELEASE 5.0.5.RELEASE 3.4.5 org.mybatis mybatis ${mybatis.version} org.springframework spring-webmvc ${springmvc.version} org.springframework spring-context ${spring.version} org.springframework spring-core ${spring.version} org.springframework spring-aop ${spring.version} org.springframework spring-web ${spring.version} org.springframework spring-expression ${spring.version} org.springframework spring-beans ${spring.version} org.springframework spring-aspects ${spring.version} org.springframework spring-context-support ${spring.version} org.springframework spring-test ${spring.version} org.springframework spring-jdbc ${spring.version} org.springframework spring-tx ${spring.version} org.apache.maven.plugins maven-compiler-plugin 3.1 1.8 1.8 UTF-8 <a name="1cf658e3"></a> ### 子工程maven_pojo构建xml <?xml version=”1.0” encoding=”UTF-8”?> maven_parent com.itheima 1.0-SNAPSHOT 4.0.0 maven_pojo log4j log4j 1.2.12 c3p0 c3p0 0.9.1.2
<!--添加到要上传的项目pom中确定上传路径开始-->
<distributionManagement>
    <repository>
        <id>releases</id>
        <url>http://localhost:8081/nexus/content/repositories/releases/</url>
    </repository>
    <snapshotRepository>
        <id>snapshots</id>
        <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
    </snapshotRepository>
</distributionManagement>
<!--添加到要上传的项目pom中确定上传路径结束-->


<a name="d16bccc1"></a>
### 子工程maven_dao工程的pom.xml文件

```xml
<?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">
    <parent>
        <artifactId>maven_parent</artifactId>
        <groupId>com.itheima</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>maven_dao</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.itheima</groupId>
            <artifactId>maven_pojo</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- Mybatis和mybatis与spring的整合 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>
        <!-- MySql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>
        <!-- druid数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.9</version>
        </dependency>
        <!-- spring相关 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
        </dependency>
        <!-- junit测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
</project>

子工程maven_service工程的pom.xml文件

<?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">
    <parent>
        <artifactId>maven_parent</artifactId>
        <groupId>com.itheima</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>maven_service</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.itheima</groupId>
            <artifactId>maven_dao</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

子工程maven_web工程的pom.xml文件

<?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">
    <parent>
        <artifactId>maven_parent</artifactId>
        <groupId>com.itheima</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>maven_web</artifactId>
    <packaging>war</packaging>

    <name>maven_web Maven Webapp</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.itheima</groupId>
            <artifactId>maven_service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
    </dependencies>

    <build>
        <finalName>maven_web</finalName>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
            <plugins>
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
                <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.22.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

1)maven_parent为父工程,其余工程为子工程,都继承父工程maven_parent

2)maven_parent工程将其子工程都进行了聚合

3)子工程之间存在依赖关系,比如maven_dao依赖, maven_pojo、maven_service依赖maven_dao、 maven_web依赖maven_service

第7章 maven私服

maven私服就是公司局域网内的maven远程仓库,每个员工的电脑上安装maven软件并且连接maven私服,程序员可以将自己开发的项目打成jar并发布到私服,其它项目组成员就可以从私服下载所依赖的jar。私服还充当一个代理服务器的角色,当私服上没有jar包时会从maven中央仓库自动下载。

nexus 是一个maven仓库管理器(其实就是一个软件),nexus可以充当maven私服,同时nexus还提供强大的仓库管理、构件搜索等功能。

7.1 搭建maven私服

①下载nexus

https://help.sonatype.com/repomanager2/download/download-archives—-repository-manager-oss

②安装nexus

将下载的压缩包进行解压,进入bin目录

打开cmd窗口并进入上面bin目录下,执行nexus.bat install命令安装服务(注意需要以管理员身份运行cmd命令)

③启动nexus

经过前面命令已经完成nexus的安装,可以通过如下两种方式启动nexus服务:

在Windows系统服务中启动nexus【右击—-任务管理器—-启动】

在命令行执行nexus.bat start命令启动nexus

④访问nexus

启动nexus服务后,访问http://localhost:8081/nexus

点击右上角LogIn按钮,进行登录。

默认账户为 admin,密码就需要到 sonatype-work/nexus3 里寻找

登录成功后点击左侧菜单Repositories可以看到nexus内置的仓库列表

上传jar包

【upload】—-【maven-releases】—-【browse]—-填写【group id】【artifact id】【version】—-【upload】

查看上传的jar包

【browse】—-【maven-releases】

7.2 nexus仓库类型

通过前面的仓库列表可以看到,nexus默认内置了很多仓库,这些仓库可以划分为4种类型,每种类型的仓库用于存放特定的jar包,具体说明如下:

①hosted,宿主仓库,部署自己的jar到这个类型的仓库,包括Releases和Snapshots两部分,Releases为公司内部发布版本仓库、 Snapshots为公司内部测试版本仓库

②proxy,代理仓库,用于代理远程的公共仓库,如maven中央仓库,用户连接私服,私服自动去中央仓库下载jar包或者插件

③group,仓库组,用来合并多个hosted/proxy仓库,通常我们配置自己的maven连接仓库组

④virtual(虚拟):兼容Maven1版本的jar或者插件

7.3 将项目发布到maven私服

maven私服是搭建在公司局域网内的maven仓库,公司内的所有开发团队都可以使用。例如技术研发团队开发了一个基础组件,就可以将这个基础组件打成jar包发布到私服,其他团队成员就可以从私服下载这个jar包到本地仓库并在项目中使用

配置maven的settings.xml文件

<server>
<id>releases</id>
<username>admin</username>   
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>

配置项目的pom.xml文件

<distributionManagement>
<repository>
   <id>releases</id>
   <url>http://localhost:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
   <id>snapshots</id>               <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>    </snapshotRepository>
</distributionManagement>

执行mvn deploy命令

7.4 从私服下载jar到本地

在maven的settings.xml文件中配置

<profile>
    <id>dev</id>
        <repositories>
        <repository>
            <id>nexus</id>
        <!--仓库地址,即nexus仓库组的地址-->
            <url>
            http://localhost:8081/nexus/content/groups/public/</url>
        <!--是否下载releases构件-->
            <releases>
            <enabled>true</enabled>
            </releases>
        <!--是否下载snapshots构件-->
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        </repositories>
<pluginRepositories>
    <!-- 插件仓库,maven的运行依赖插件,也需要从私服下载插件 -->
    <pluginRepository>
        <id>public</id>
        <name>Public Repositories</name>
        <url>
        http://localhost:8081/nexus/content/groups/public/</url>
        </pluginRepository>
        </pluginRepositories>
</profile>

在maven的settings.xml文件中配置激活下载

<activeProfiles>
    <activeProfile>dev</activeProfile>
</activeProfiles>

第8章 将第三方jar安装到本地仓库和maven私服

在maven工程的pom.xml文件中配置某个jar包的坐标后,如果本地的maven仓库不存在这个jar包,maven工具会自动到配置的maven私服下载,如果私服中也不存在,maven私服就会从maven中央仓库进行下载。

但是并不是所有的jar包都可以从中央仓库下载到,比如常用的Oracle数据库驱动的jar包在中央仓库就不存在。此时需要到Oracle的官网下载驱动jar包,然后将此jar包通过maven命令安装到我们本地的maven仓库或者maven私服中,这样在maven项目中就可以使用maven坐标引用到此jar包了。

8.1 将第三方jar安装到本地仓库

①下载Oracle的jar包(略)

②mvn install命令进行安装

  mvn install:install-file -Dfile=ojdbc14-10.2.0.4.0.jar -DgroupId=com.oracle -DartifactId=ojdbc14 –

  Dversion=10.2.0.4.0 -Dpackaging=jar

③查看本地maven仓库,确认安装是否成功

8.2 将第三方jar安装到maven私服

①下载Oracle的jar包(略)

②在maven的settings.xml配置文件中配置第三方仓库的server信息

<server>
  <id>thirdparty</id>
  <username>admin</username>
  <password>admin123</password>
</server>

③执行mvn deploy命令进行安装

  mvn deploy:deploy-file -Dfile=ojdbc14-10.2.0.4.0.jar -DgroupId=com.oracle -DartifactId=ojdbc14 –

  Dversion=10.2.0.4.0 -Dpackaging=jar –

  Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty