maven笔记整理

1. Maven介绍

1.1. 过去开发过程中的问题

  • 项目中使用的jar包 , 需要先下载再导入和添加依赖
  • jar包之间的依赖关系 , 程序员需要明确 , 否则报错 , 比如jar包A依赖于jar包B , 如果只导入jar包A程序将报错
  • 项目工程都在一个大的工程中 , 所有代码都写在了一个工程中 , 这样功能做不到抽取 , 更做不到分模块开发
  • 实际开发中 , 手动导入jar包 , 可能存在jar包之间的版本兼容问题 , 特别是依赖包

1.2. 什么是Maven

Maven是一个采用纯java编写的开源项目管理工具 , Maven采用了一种被称为Project Object Modle(POM)概念来管理项目 , 所有的项目配置信息被定义在一个POM.xml文件中 , 通过该文件Maven可以管理项目的整个生命周期 , 包括清除 编译 测试 报告 打包 部署等等 , 目前Apache下绝大多数项目都已经采用Maven进行管理 , Maven本身还支持多种插件 , 可以方便灵活的控制项目 , 开发人员的主要任务应该是关注商业逻辑并实现它 , 而不是把时间浪费在学习如何在不同的环境中依赖jar包 , 部署项目等 , Maven正是为了将开发人员从这些任务中解脱出来而诞生的

总结 : Maven是一个采用纯Java编写的开源项目管理工具 , 提供了聚合工程来管理项目 , 通过生命周期可以一键构建项目

1.3. Maven解决的问题

  • 解决导包jar包问题 : 使用maven后 , 只需要关注需要功能的包即可 , 这个包依赖的其他包会自动导入
  • 解决版本兼容问题 : 当导入一个功能包后 , 这个功能包依赖的其他包会自动导入 , 并且没有兼容问题
  • 解决项目构建问题 : maven提供了聚合工程 , 可以把三层架构的代码抽取成多个工程

1.4. Maven的作用

  • 依赖管理
  • 一键构架

1.4.1. 依赖管理

依赖管理 : 分为依赖和管理

  • 依赖 : 就是导入jar包 , 分为直接依赖和间接依赖
    • 直接依赖 : 项目中真正倒入了坐标
    • 间接依赖 : 项目中没有真正导入坐标 , 但是包依然导入了
  • 管理 : 版本管理(聚合工程 , 版本管理交给父工程管理)

1.4.2. 一键构架

从项目开发到部署都是通过maven命令完成 , 依赖生命周期

1.5. Maven下载

在安装idea的时候自带maven , 使用的过程中可以使用自带的maven也可以使用外部的 , 一般情况下都会使用外部的maven

idea是2019版本推荐使用3.6.1 , idea是2020版本推荐使用3.6.3

maven官网下载地址

下载下来直接解压即可 , 文件路径不能有中文和空格

1.6. Maven工程的包的介绍

  • bin : 命令文件夹 , 可执行文件
  • boot : 启动器(引导程序)
  • conf : maven配置文件
  • lib : maven需要的jar包

1.7. Maven的使用

maven的使用方式有2种 : 1. 控制台命令使用 2. idea集成

  • 控制台命令使用 : 需要配置环境变量 , 将解压后文件的bean目录配置到环境变量中 , 并通过指令进行操作
    • 新建环境变量 , 变量名MAVEN_HOME变量值maven文件夹地址
    • 配置path环境变量 , 地址为%MAVEN_HOME%\bin
    • 通过cmd命令行的mvn命令可以查看是否配置成功
  • idea集成 :
    • idea -> file -> close project -> idea右下角configure -> setting, 搜索maven , 这种方式配置的是全局的maven , 如果在项目中配置setting只能配置单个项目的 , 切换项目后会失效
    • 配置maven home directory , 选择maven的安装目录
    • 配置User setting file选择使用哪一个配置文件 , 勾选override , 选择maven解压目录\conf\setting.xml
    • 配置Local repository, 选择一个自己创建的文件名为repository的文件夹即可
    • 在电脑中找到并修改配置文件setting.xml

2. maven的仓库介绍

2.1. maven中导入坐标的方式

导入坐标的方式 :

  • pom.xml配置文件中引入一个坐标
  • maven会根据坐标自动去仓库下载相关jar包

2.2. 仓库的分类

  • 中央仓库
    • 最核心 , 最大的 , jar包最全的 , 服务于全球的一个仓库 , 有专门的团队在维护
  • 远程仓库
    • 公司内部搭建远程仓库
    • 云在线仓库
  • 本地仓库
    • 电脑中的某一个文件夹作为本地仓库 , 用来存放从中央仓库或者远程仓库拉取下来的jar

2.3. 本地仓库的创建配置

  1. 创建文件夹
  2. 在maven的配置文件中 , 指定这个文件夹为本地仓库
  3. 配置文件位于maven解压目录\config\settings.xml
  4. 修改localRepository配置 , 如果不设置默认位于c盘下
  5. localRepository指定为自己设置的文件夹 , 例 : <localRepository>E:\\repository</localRepository>

2.4. maven查找jar包的过程

  1. 在工程中引入一个jar包
  2. maven会自动查找这个坐标对应的jar包
    1. 如果本地仓库有对应jar包 , 则直接拉取 , 并不继续执行
    2. 如果本地仓库没有对应jar包 , 此时看有没有配置远程仓库
      1. 如果配置了远程仓库 , 此时去远程仓库
        1. 如果远程仓库有 , 则直接拉取到本地仓库
        2. 如果远程仓库也没有 , 则去中央仓库找
      2. 如果没有配置远程仓库 , 此时去中央仓库找(速度慢)

2.5. 配置阿里镜像远程仓库

在配置和安装的过程中 , 经常会下载一些文件 , 如果本地仓库没有会去远程仓库找 , 如果没有没有配置远程仓库 , 则会去中央仓库找 , 中央仓库位于大洋彼岸 , 下载速度较慢 , 因此需要配置一个远程仓库

配置远程仓库方式 :

  • 将下方配置文件复制粘贴至 , 配置文件setting.xml<mirrors>标签内即可

    	<mirror>
    		<id>alimaven</id>
    		<name>aliyun maven</name>
    		<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    		<mirrorOf>central</mirrorOf>
    	</mirror>
    

3. maven工程的创建

3.1. 创建普通java工程

创建普通java工程步骤 :

  1. fiel -> new -> porject ->选择maven -> 不选择任何东西 , 点击next , 创建maven普通java工程
  2. 设置工程名称 , 组织名称 , 项目名称 , 版本号
    1. 设置name : 名称
    2. 设置GroupId : 组织名称 , 一般取值为包名 , 或是公司域名倒写(也是包名)
    3. 设置ArtifactId : 项目名称 , 默认与名称一致
    4. 设置Version : 版本号, 一般为1.0
  3. Finish完成创建

3.1.1. maven的普通java工程介绍

maven普通java工程解构 :

  • 项目名称
    • src
      • main
        • java : 写java代码的位置
        • resource : 写配置文件的位置
      • test : 写测试
    • pom.xml : 与src同级 ,

pom.xml介绍 :

pom.xml是maven工程的功能性文件 , 可以用来配置 : 依赖包 , 插件 , 字符编码集 , 仓库 , 版本

<?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>
    
	<!--
	组织id , 项目名称 , 版本  
	这三个信息构成一个坐标 , 坐标是唯一值 , 只要三者有一个发生改变就变成另一个工程 , 只有完全一致时才是同一个工程
	举例 : 版本2.0和版本1.0 是2个工程不是1个-->
    <groupId>com.mavenTest.cn</groupId>
    <artifactId>javaMavenTest01</artifactId>
    <version>1.0-SNAPSHOT</version>

</project>

3.2. 创建web工程

3.2.1. 通过骨架创建

通过骨架创建web工程步骤 :

  1. fiel -> new -> porject ->选择maven -> 勾选Create from achetype -> 选择maven-achetype-webapp
  2. 设置工程名称 , 组织名称 , 项目名称 , 版本号
    1. 设置name : 名称
    2. 设置GroupId : 组织名称 , 一般取值为包名 , 或是公司域名倒写(也是包名)
    3. 设置ArtifactId : 项目名称 , 默认与名称一致
    4. 设置Version : 版本号, 一般为1.0
  3. 确认配置文件和仓库位置 , 完成创建
  4. 第一次创建web工程会到远程仓库下载文件

这种方式缺陷 :

  1. 只有webapp文件夹 , 没有java和resources , 需要手动创建
  2. 默认jdk版本是1.7
  3. pom文件中生成一些无用东西
  4. web.xml的DTD约束变了 , 不影响使用

3.2.2. 创建普通工程 , 改造为web工程

将普通工程改造为web工程步骤 :

  1. 创建普通工程

  2. file -> Project Structure -> facets

  3. 添加一个web模块 , 并选择给具体工程添加模块

  4. 修改web模块地址 , 改到\工程\src\main下 , 模块名为webapp

    举例 : ...\javaMavenTest\src\main\webapp\WEB-INF\web.xml

  5. 修改访问目录 , 当访问\时访问的目录 , web模块地址

    举例 : ...\javaMavenTest\src\main\webapp

  6. 动态生成war包

  7. 在pom.xml中指定打包方式<packaging>war</packaging>

优缺点 :

  • java和resources都有 , 需要手动改造目录
  • 需要手动添加war包
  • web.xml头部DTD没有改变

4. maven的JDK版本问题

maven创建的工程默认jdk版本是1.5 (通过file -> setting -> 搜素java compiler查看)

修改maven工程JDK版本的3种方式 :

  1. 局部修改 : 修改单一的maven工程 , 创建新的工程需要重新配置 , 了解即可

    1. 使用配置修改

      在pom.xml中配置 , 通过properties修改jdk版本 , 修改完成后需要刷新配置文件否则无法生效

        <properties>
              <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
              <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
              <java.version>1.8</java.version>
              <maven.compiler.source>1.8</maven.compiler.source>
              <maven.compiler.target>1.8</maven.compiler.target>
        </properties>
      
    2. 使用插件修改

       <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. 全局修改

    找到maven的安装路径 , 进入conf文件夹 , 找到setting.xml文件 , 将下面的配置粘贴进<profiles>标签内

    <profile>
    		<id>jdk1.8</id>
    		<activation>
    			<activeByDefault>true</activeByDefault>
    				<jdk>1.8</jdk>
    			</activation>
    		<properties>
    			<maven.compiler.source>1.8</maven.compiler.source>
    			<maven.compiler.target>1.8</maven.compiler.target>
    			<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    			<maven.compiler.encoding>utf-8</maven.compiler.encoding>
    		</properties>
    	</profile>
    

5. maven生命周期

一个项目的开发流程 :
编码 -> 编译 -> 测试 -> 运行 -> 打包 -> 部署

maven的生命周期 :
​ 每个生命周期对应的都是一个指令 , 这个指令可以在cmd中使用 , mvn-指令名称
​ idea集成了maven命令 , 每个maven工程右侧都有一个maven选项卡
​ 选项卡中可以直接点击指令 , 进行操作

需要掌握的指令 :
​ clean : 清理工作 , 主要清理target目录
​ comple : 编译工作 , 将java文件到达class文件
​ package : 打包 , 把项目达成jar或war , 需要使用packaging命令指定打包样式
​ install : 把项目安装到本地项目 , 让别的项目引入本项目坐标 , 然后使用

  • 编码 : 写代码 , java文件
  • 编译 : 代码编写完成后 , 变成class文件
    • maven指令 : comple
  • 测试 : 上线前对功能进行测试
    • maven指令 : test
  • 运行 : 项目运行
    • maven命令 : run
  • 打包 : java项目打成jar , web项目打成war
    • mavne命令 : package
    • 通过pom.xml配置<packaging>标签的值选择将项目打成什么包
    • <packaging> 可选参数有 jar(默认值 , 不写默认打成jar包) war pom
  • 安装 : 将java包安装到本地仓库
    • maven命令 : install
  • 部署 : 上线到生产环境
    • maven命令 : deploy
  • 清理 : 清理已经编译好的class文件
    • maven命令 : clean
  • 生命周期在执行的过程中 , 位于下面的生命周期会自动执行上面的所有生命周期(clean除外 , clean不执行)

使用idea编写maven项目 , 可以使用自带的maven命令 , 点击右侧maven选项 , 选择项目 , 选择Lifecycle(生命周期) , 生命周期内的内容就是生命周期方法

6. maven工程的运行方式

6.1. 使用maven-tomcat插件运行web工程

基本不实用这种方式 , 因为这种方式使用tomcat7 , tomcat7已经被淘汰 , 并且只有tomcat7的插件 , 没有更高版本

步骤 :

  1. 引入tomcat插件

    <build>
        <plugins>
            <!--在pom文件中 添加comcat7插件 -->
    
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
    
                <configuration>
                    <!-- 项目访问路径 本例:localhost:9090, 如果配置的aa,则访问路径为localhost:9090/aa -->
                    <path>/</path>
                    <port>9090</port>
                    <uriEncoding>UTF-8</uriEncoding><!-- 非必需项 -->
                </configuration>
            </plugin>
        </plugins>
    </build>
    
  2. 使用插件运行

6.2. 使用maven-jetty插件运行web工程

jetty插件一直在更新 , 支持新版tomcat , 可以使用

步骤 :

  1. 引入jetty插件

          <plugin>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>9.3.0.M2</version>
            <configuration>
              <webAppConfig>
                <!--配置根路径-->
                <contextPath>/</contextPath>
              </webAppConfig>
              <httpConnector>
                <!--配置端口-->
                <port>10000</port>
              </httpConnector>
            </configuration>
          </plugin>
    
  2. 使用插件运行

6.3. 使用本地tomcat运行web工程

使用方法和普通web工程一样

  1. 添加web工程
  2. 配置tomcat
  3. 部署项目

7. 坐标的作用范围

引入坐标时的<scope>属性 , 可以指定依赖的作用范围

  • compile

    默认scope取值为compile , 表示当前依赖参与项目的编译 测试 和运行阶段 , 属于强依赖 , 打包时会打到包里

  • test

    该依赖仅参与测试相关内容 , 包括测试用例的编译和执行 , 比如Junit

  • runtime

    该依赖仅参与运行周期的使用 , 编译不参与 , 一般这种类库都是接口与实现类相分离的库 , 比如JDBC类库 , 在编译时仅依赖相关接口 , 在具体运行时 , 才需要具体的mysql , oracle等等数据的驱动程序 , 此类驱动都是runtime的类库

  • provided

    该依赖在打包的过程中 , 不需要打进去 , 这个有运行和环境来提供 , 比如tomcat或者基础类库等等 , 事实上 , 该依赖可以参与编译 测试和运行等周期 , 与compile等同 , 区别在于打包阶段进行了exclude操作

posted @ 2021-06-13 20:47  小_Leo  阅读(68)  评论(0编辑  收藏  举报