A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fxdd 黑马粉丝团   /  2020-10-17 07:15  /  2285 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

什么是Maven?

如今我们构建一个项目需要用到很多第三方的类库,如写一个使用Spring的Web项目就需要引入大量的jar包。一个项目Jar包的数量之多往往让我们瞠目结舌,并且Jar包之间的关系错综复杂,一个Jar包往往又会引用其他Jar包,缺少任何一个Jar包都会导致项目编译失败。

以往开发项目时,程序员往往需要花较多的精力在引用Jar包搭建项目环境上,而这一项工作尤为艰难,少一个Jar包、多一个Jar包往往会报一些让人摸不着头脑的异常。

而Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。
安装Maven 和 Maven的Eclipse插件

安装Maven和Maven的Eclipse插件,用Eclipse的同学可以参考,推荐使用IDEA开发;
Maven规定的目录结构
Maven基本命令

    -v:查询Maven版本

    本命令用于检查maven是否安装成功。

    Maven安装完成之后,在命令行输入mvn -v,若出现maven信息,则说明安装成功。

    compile:编译

    将java源文件编译成class文件

    test:测试项目

    执行test目录下的测试用例

    package:打包

    将项目打成jar包

    clean:删除target文件夹

    install:安装

    将当前项目放到Maven的本地仓库中。供其他项目使用

什么是Maven仓库?

Maven仓库用来存放Maven管理的所有Jar包。分为:本地仓库 和 中央仓库。

    本地仓库:Maven本地的Jar包仓库。
    中央仓库: Maven官方提供的远程仓库。

当项目编译时,Maven首先从本地仓库中寻找项目所需的Jar包,若本地仓库没有,再到Maven的中央仓库下载所需Jar包。
什么是“坐标”?

在Maven中,坐标是Jar包的唯一标识,Maven通过坐标在仓库中找到项目所需的Jar包。

如下代码中,groupId和artifactId构成了一个Jar包的坐标

传递依赖 与 排除依赖

    传递依赖:如果我们的项目引用了一个Jar包,而该Jar包又引用了其他Jar包,那么在默认情况下项目编译时,Maven会把直接引用和简洁引用的Jar包都下载到本地。
    排除依赖:如果我们只想下载直接引用的Jar包,那么需要在pom.xml中做如下配置:(将需要排除的Jar包的坐标写在中)

依赖范围scope

在项目发布过程中,帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。   
- compile :默认范围,用于编译      
- provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath      
- runtime: 在执行时需要使用      
- test:    用于test任务时使用      
- system: 需要外在提供相应的元素。通过systemPath来取得      
- systemPath: 仅用于范围为system。提供相应的路径      
- optional:   当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用
依赖冲突

若项目中多个Jar同时引用了相同的Jar时,会产生依赖冲突,但Maven采用了两种避免冲突的策略,因此在Maven中是不存在依赖冲突的。

1.短路优先

    本项目——>A.jar——>B.jar——>X.jar
    本项目——>C.jar——>X.jar

若本项目引用了A.jar,A.jar又引用了B.jar,B.jar又引用了X.jar,并且C.jar也引用了X.jar。

在此时,Maven只会引用引用路径最短的Jar。

2.声明优先

若引用路径长度相同时,在pom.xml中谁先被声明,就使用谁。
聚合

    什么是聚合?

    将多个项目同时运行就称为聚合。

    如何实现聚合?

    只需在pom中作如下配置即可实现聚合:

    <modules>
        <module>web-connection-pool</module>
        <module>web-java-crawler</module>
    </modules>

继承

    什么是继承?

    在聚合多个项目时,如果这些被聚合的项目中需要引入相同的Jar,那么可以将这些Jar写入父pom中,各个子项目继承该pom即可。

    如何实现继承?

    父pom配置:将需要继承的Jar包的坐标放入标签即可。

    <dependencyManagement>
        <dependencies>
              <dependency>
                <groupId>cn.missbe.web.search</groupId>
                <artifactId>resource-search</artifactId>
                <packaging>pom</packaging>
                <version>1.0-SNAPSHOT</version>
              </dependency>
        </dependencies>
    </dependencyManagement>

    子pom配置:

    <parent>
          <groupId>父pom所在项目的groupId</groupId>
          <artifactId>父pom所在项目的artifactId</artifactId>
          <version>父pom所在项目的版本号</version>
    </parent>
     <parent>
          <artifactId>resource-search</artifactId>
          <groupId>cn.missbe.web.search</groupId>
          <version>1.0-SNAPSHOT</version>
    </parent>

使用Maven构建Web项目

    New Maven项目:选择WebApp:

    若使用JSP,需添加Servlet依赖:

    注:Servlet依赖只在编译和测试时使用!

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <!-- 只在编译和测试时运行 -->
        <scope>provided</scope>
    </dependency>

    在Bulid Path中设置resource输出目录:

    勾选:Dynamic Web Module

    删掉测试目录

    在pom中加入jetty的插件,并设置JDK版本:

    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>  
        <artifactId>maven-compiler-plugin</artifactId>  
        <configuration>
          <source>1.8</source>  
          <target>1.8</target>
        </configuration>
      </plugin>  
      <plugin>
        <groupId>org.eclipse.jetty</groupId>  
        <artifactId>jetty-maven-plugin</artifactId>  
        <version>9.3.10.v20160621</version>  
        <executions>
          <execution>
            <phase>package</phase>
          </execution>
        </executions>
      </plugin>
    </plugins>

    运行项目:

    输入:jetty:run

    访问127.0.0.1:8080

    若出现如下界面,表示成功!

pom.xml详解

pom.xml是Maven的核心,你的项目需要什么Jar包就在pom.xml里面配置。当编译项目时Maven读取该文件,并从仓库中下载相应的Jar包。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马