Maven

一.Maven作用

1.依赖管理

传统的 WEB 项目中,我们必须将工程所依赖的 jar 包复制到工程中,导致了工程的变得很大,maven 工程中不直接将 jar 包导入到工程中,而是通过在 pom.xml 文件中添加所需 jar包的坐标,这样就很好的避免了 jar 直接引入进来,在需要用到 jar 包的时候,只要查找 pom.xml 文件,再通过 pom.xml 文件中的坐标,到一个专门用于”存放 jar 包的仓库”(maven 仓库)中根据坐标从而找到这些 jar 包,再把这些 jar 包拿去运行。
2.项目的一键构建
我们的项目,往往都要经历编译、测试、运行、打包、安装 ,部署等一系列过程。
什么是构建?
指的是项目从编译、测试、运行、打包、安装 ,部署整个过程都交给 maven 进行管理,这个过程称为构建。
一键构建
指的是整个构建过程,使用 maven 一个命令可以轻松完成整个工作。
在这里插入图片描述

二.Maven安装

http://maven.apache.org/download.cgi 下载解压
设置环境变量

sudo gedit /etc/profile

#MAVEN_HOME
export MAVEN_HOME=/workshop/maven/apache-maven-3.3.9
export PATH=${MAVEN_HOME}/bin:$PATH 

三.Maven 仓库的分类

在这里插入图片描述

1.本地仓库

用来存储从远程仓库或中央仓库下载的插件和 jar 包,项目使用一些插件或 jar 包,优先从本地仓库查找默认本地仓库位置在 u s e r . d i r / . m 2 / r e p o s i t o r y , {user.dir}/.m2/repository, user.dir/.m2/repository,{user.dir}表示 windows 用户目录

2.远程仓库

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

3.中央仓库

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

配置maven中央仓库镜像
MAVE_HOME/conf/settings.xml 中,修改
找到mirrors元素, 在它里面添加子元素mirror:

配置maven本地仓库路径
MAVE_HOME/conf/settings.xml 中,修改
/opt/apache-maven-3.6.0/repository

四.Maven 配置文件说明

maven 仓库地址、私服等配置信息需要在 setting.xml 文件中配置,分为全局配置和用户配置。在 maven 安装目录下的有 conf/setting.xml 文件,此 setting.xml 文件用于 maven 的所有project项目,它作为 maven 的全局配置。如需要个性配置则需要在用户配置中设置,用户配置的 setting.xml 文件默认的位置在: u s e r . d i r / . m 2 / s e t t i n g s . x m l 目 录 中 , {user.dir}/.m2/settings.xml 目录中, user.dir/.m2/settings.xml,{user.dir} 指 windows 中的用户目录。maven 会先找用户配置,如果找到则以用户配置文件为准,否则使用全局配置文件。
在这里插入图片描述

五.Maven 工程的目录结构

在这里插入图片描述
作为一个 maven 工程,它的 src 目录和 pom.xml 是必备的。
进入 src 目录后,我们发现它里面的目录结构如下:
在这里插入图片描述
注意:如果是普通的 java 项目,那么就没有 webapp 目录。

六.maven基本命令

1.mvn clean

把编译好的class文件删掉

2.mvn compile

编译java代码

3.mvn test

编译java源码,同时编译测试代码

4.mvn package

将项目打包,放到target目录下,java项目会打包成jar包,web项目会打包成war包

5.mvn install

将项目安装到本地仓库,供其他项目使用
在IDEA上对应按钮位置
在这里插入图片描述

六.maven 的概念模型

在这里插入图片描述

1.项目对象模型

一个 maven 工程都有一个 pom.xml 文件,通过 pom.xml 文件定义项目的坐标、项目依赖、项目信息、插件目标等。

2.依赖管理系统

通过 maven 的依赖管理对项目所依赖的 jar 包进行统一管理。
比如:项目依赖 junit4.9,通过在 pom.xml 中定义 junit4.9 的依赖即使用junit4.9,如下所示是 junit4.9
的依赖定义:
在这里插入图片描述

3.一个项目生命周期

使用 maven 完成项目的构建,项目构建包括:清理、编译、测试、部署等过程,maven 将这些过程规范为一个生命周期,如下所示是生命周期的各各阶段:
在这里插入图片描述
maven 通过执行一些简单命令即可实现上边生命周期的各各过程,比如执行 mvn compile 执行编译、执行 mvn clean 执行清理。

4.一组标准集合

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

5.插件(plugin)目标(goal)

maven 管理项目生命周期过程都是基于插件完成的。

七.IDEA创建maven项目

1.配置

在这里插入图片描述
配置这个参数防止没网的时候不能创建工程
在这里插入图片描述

2.使用maven提供的骨架创建java工程

在这里插入图片描述
然后选择 公司名称,项目名称,版本等信息
在这里插入图片描述

3.使用maven提供的骨架创建javaweb工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

八.maven依赖范围

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

九.项目中添加的坐标

在pom.xml文件中
在这里插入图片描述

十.插件设置

1.设置 jdk 编译版本

设置jdk1.8及编码字符集utf8

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>

2.添加 tomcat7 插件,并使用

<plugin>
   <groupId>org.apache.tomcat.maven</groupId>
   <artifactId>tomcat7-maven-plugin</artifactId>
   <version>2.2</version>
   <configuration>
	     <port>8090</port>
	     <path>/</path>
	     <uriEncoding>UTF-8</uriEncoding>
   </configuration>
</plugin>

在这里插入图片描述

3.配置maven编译*mapper.xml(如果不配置,那么xml文件不会被复制到class下

在pom.xml配置如下内容

<build>
	  <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
            	<!-- maven打包时跳过test测试-->
                <skip>true</skip>
            </configuration>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
        <!-- 这个必须加,因为添加完上面,resources目录中的自动编译将失效-->
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.*</include>
            </includes>
        </resource>
    </resources>
</build>

如果要编译所有文件:

<build>
    <resources>
        <resource>
            <directory>src/main</directory>
            <includes>
                <include>**/*.*</include>
            </includes>
        </resource>
    </resources>
</build>

注意有的时候:resources文件夹下面的配置文件不会被编译到classpath下,只需rebuild 项目即可

十一.依赖传递 ,依赖冲突 及 排除依赖

1.依赖传递

直接依赖和间接依赖
test2 依赖 test1,test3依赖test2
则 test2 直接依赖 test1,test3间接依赖test1

当test1项目引入 jar包 scope 为 compile 的时候,项目test2,test3都可以用这个 jar包
当test1项目引入 jar包 scope 为 test 的时候,项目test2,test3想要使用这个jar包,需要在pom.xml重新导入坐标

关闭依赖传递:true
在依赖中添加optional选项决定此依赖是否向下传递,如果是true则不传递,如果是false就传递,默认为false
在这里插入图片描述

2.依赖冲突

假如test1 使用junit4.10依赖,并且scope是 compile,那么test2,test3都可以使用 test1的junit4.10,因为依赖传递了
假如test2使用junit4.9依赖,那么test3就会使用 就近的一个依赖,也就是说junit4.9

3.排除依赖

exclusions可用于排除依赖,注意exclusions是写在dependency中
在这里插入图片描述

十二.一些常见的问题

1.maven项目如果代码用到servlet API,如HttpServletRequest,需要在pom

文件中导入Servlet坐标

<dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>servlet-api</artifactId>
   <version>2.5</version>
   <scope>provided</scope>
</dependency>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值