[Maven入门][学习笔记]

举报
John2021 发表于 2022/09/12 06:53:55 2022/09/12
【摘要】 1.Maven介绍 1.1.Maven是什么Maven是一个项目管理工具,包含了一个项目对象模型(Project Object Model,POM),在配置中就是pom.xml文件。是一组标准集合,一个项目的生命周期、一个依赖管理系统,还包括在项目生命周期阶段的插件(plugin)和目标(goal)。当我们使用Maven时,通过一个自定义的项目对象模型,pom.xml来描述当前这个项目。M...

1.Maven介绍

1.1.Maven是什么

Maven是一个项目管理工具,包含了一个项目对象模型(Project Object Model,POM),在配置中就是pom.xml文件。是一组标准集合,一个项目的生命周期、一个依赖管理系统,还包括在项目生命周期阶段的插件(plugin)和目标(goal)。
当我们使用Maven时,通过一个自定义的项目对象模型,pom.xml来描述当前这个项目。
Maven中的两大核心分别是:依赖管理、项目构建。
依赖管理:对jar的统一管理(Maven提供了一个Maven的中央仓库,https://mvnrepository.com/,当我们在项目中添加完依赖之后,Maven会自动去中央仓库下载相关的依赖,并且解决依赖问题)。
项目构建:对项目进行编译、测试、打包、部署、上传到私服等。

1.2.为什么使用Maven

由于Java的工具类都是以jar包形式出现,各个jar包之间会有关联,在使用一个依赖之前还需要确定这个依赖所依赖的其他依赖,所以当项目比较大的时候,依赖管理将会变得非常麻烦,而Maven恰好解决了这个问题。
Maven还可以处理多模块项目。简单的项目,单模块分包处理即可,如果项目比较复杂,要分成多模块项目,每个单独的模块都无法独立运行,要多个模块合在一起,项目才可以运行,这时借助Maven工具,可以实现项目的一键打包。

2.Maven安装

  • Maven是Java项目,需要先安装JDK。
  • 在Apache官网下载Maven的压缩包(apache-maven-3.5.4-bin.zip)。
  • 解压压缩包并进行配置,压缩包里的四个文件夹分别是(bin->可执行程序;boot->引导程序;conf->配置文件目录;lib->Maven的程序jar包)。
  • 配置环境变量
    • 新建系统变量指向Maven文件夹。
    • 配置环境变量指向Maven文件夹里的bin文件夹。
  • 检验安装
    • 在CMD中输入mvn -v,如果显示出Maven版本号则安装成功。

3.Maven配置

没有特殊需求的话,完成了Maven安装后就可以直接使用了,但通常会对中央仓库进行配置为国内仓库以达到更快的下载速度。

3.1.仓库类型

仓库类型 说明
本地仓库 就是自己电脑上的仓库,每个人电脑都有一个仓库,默认位置在当前用户名\.m2\repository
私服仓库 一般来说是公司内部搭建的Maven私服,处于局域网内,访问速度较快,这个仓库中存放的jar是公司内部自己开发的jar。
中央仓库 由Apache团队维护,包含了大部分的jar,早期不包含Oracle数据库驱动,从2019年8月开始包含Oracle驱动。

jar对这三个库的查找顺序为:先从本地仓库查找,如果本地仓库没有找到,在没有安装私服的前提下回到中央仓库查找,有安装私服优先在私服查找,私服找不到后去中央仓库进行查找。

3.2.本地仓库配置

本地仓库默认位置在当前用户名\.m2\repository,如果想自定义本地仓库位置的话,在conf/settings.xml中自定义本地仓库位置:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->

3.3.远程镜像配置

由于默认的中央仓库下载较慢,因此可以将远程仓库地址改为国内仓库地址进行jar包的下载:

<mirrors>
    <!-- mirror
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |
    <mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
    </mirror>
     -->
     <mirror>
      <id>maven-default-http-blocker</id>
      <mirrorOf>external:http:*</mirrorOf>
      <name>Pseudo repository to mirror external repositories initially using HTTP.</name>
      <url>http://0.0.0.0/</url>
      <blocked>true</blocked>
    </mirror>
    <mirror>
      <id>new maven</id>
      <mirrorOf>*</mirrorOf>
      <name>仓库名字</name>
      <url>仓库地址</url>
    </mirror>
</mirrors>

4.Maven常用命令

常用命令 中文含义 说明
mvn clean 清理 这个命令可以用来清理已经编译好的文件
mvn compile 编译 将Java代码编译成Class文件
mvn test 测试 项目测试
mvn package 打包 根据用户的配置,将项目打包成jar包或者war包
mvn install 安装 手动向本地仓库安装一个jar
mvn deploy 上传 将jar上传到私服

4.1.通过命令构建项目

创建命令:

mvn archetype:generate -DgroupId=org.example -DartifactId=firstapp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

看到如下提示,表示项目创建成功:

项目创建成功后,就两个文件:

src里的两个文件夹是项目最核心的:main(Java代码和项目资源)和test(项目测试相关代码)。
在pom.xml文件中,定义了所有的项目配置。

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>firstapp</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>firstapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

4.2.对项目进行打包

项目创建完成后通过mvn package命令可以将刚刚创建的项目打成一个jar包。在打包之前,需要配置JDK版本至少为7以上,因此我们需要手动修改pom.xml文件。

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>firstapp</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>firstapp</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
    <java.version>11</java.version>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

添加完成后,执行打包命令,注意执行所有命令时,命令行要定位到pom.xml文件所在的目录,看到如下图所示表示项目打包成功。

4.3.将项目安装到本地仓库

如果需要将项目安装到本地仓库,可以直接执行mvn install命令,注意,mvn install命令会包含上面的mvn package过程。

安装到本地仓库之后,这个时候,点开自己的本地仓库,就能看到相关的jar包了。

5.Maven依赖管理

Maven项目,如果需要使用第三方的控件,都是通过依赖管理来完成的。这里用到的一个东西就是pom.xml文件,概念叫做项目对象模型(POM,Project Object Model),我们在pom.xml中定义了Maven项目的形式,所以,pom.xml相当于是Maven项目的一个地图。

5.1.Maven坐标

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
</dependencies>
  1. dependencies
    • 在dependencies标签中,添加项目需要的jar所对应的maven坐标。
  2. dependency
    • 一个dependency标签表示一个坐标
  3. groupId
    • 团体、公司、组织机构等等的唯一标识。团体标识的约定是它以创建这个项目的组织名称的逆向域名开头。一个maven坐标必须要包含groupId。一些典型的groupId如apache的groupId是org.apache。
  4. artifactId
    • artifactId相当于在一个组织中项目的唯一标识符。
  5. version
    • 一个项目的版本。一个项目的话,可能会有多个版本。如果是正在开发的项目,我们可以给版本号加上一个SNAPSHOT,表示这是一个快照版(新建项目的默认版本号就是快照版)。
  6. scope
    • 表示依赖范围

      依赖范围 编译有效 测试有效 运行时有效 打包有效 例子
      compile spring-core
      test × × × JUnit
      provided × × servlet-api
      runtime × JDBC驱动
      system × × 本地maven仓库之外的类库
    • 我们添加了很多依赖,但不同依赖的使用范围是不一样的。最典型的有两个,一个是数据库驱动,另一个是单元测试。

    • 数据库驱动,在使用的过程中,自己写代码,写的是JDBC代码,只有在项目运行时,才需要执行MySQL驱动中的代码。所以,MySQL驱动这个依赖在添加到项目中之后,可以设置它的scope为runtime,编译的时候不生效。

    • 单元测试,只有在测试的时候才生效,可以设置为test,这样,项目打包发布时,单元测试的依赖就不会跟着发布。

5.2.依赖冲突

依赖冲突产生的原因是:比如,a.jar依赖b.jar,同时a.jar依赖d.jar,而b.jar和d.jar都依赖于c.jar。这时候,a和b、d的关系是直接依赖的关系,a和c的关系是间接依赖的关系。

5.2.1.冲突解决

  1. 先定义先使用
  2. 路径最近原则(直接声明使用)
    除了上面两条默认行为之外,也可以手动控制。手动控制主要是通过排除依赖来实现
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.20</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

表示从spring-context中排除spring-core依赖。

6.聚合工程

聚合工程实际就是多模块项目。在一个比较大的互联网项目中,项目需要拆分成多个模块进行开发,比如订单模块、VIP模块、支付模块、内容管理模块、CMS、CRM等等。
这种情况为什么不能用分包呢?小项目可以分包管理,大项目就没办法进行分包了。比如,一个大的电商系统中,有一个子模块叫用户管理、还有一个子模块叫订单管理,这两个子模块都涉及到了用户,像这种情况,我们需要把用户类单独提取出来,做成单独的模块,供其他模块调用。

6.1.多模块项目展示

project->parent;
parent->cms\crm\manager;
manager->manager-model\manager-dao\manager-service\manager->web;
以manager为例子,本身并不提供功能,只负责管理他自己的子模块,而其子模块每一个都无法独立运行,需要四个结合在一起才可以运行。项目打包时,model\dao\service都打包成jar,然后会自动将打包好的jar复制到web中,再自动将web打包成war包。

6.2.idea中创建聚合工程

  1. 创建一个空maven项目。

  2. 项目创建完成后,由于parent不参与业务实现,只是用来管理子模块,因此,src目录可以删除。

  3. 选中工程,右键单击,new->module。

  4. 然后继续选择创建一个maven项目。

  5. 可以看到已经默认指明了当前module的parent,开发者只需要填入当前module的artifactId即可。

  6. manager创建完成后,观察parent的pom.xml文件,可以看到已经自动加上了packing属性。

  7. packaging属性为pom,表示为一个聚合工程,同时还多了modules节点,指明了它自己的子模块。同时看到manager,自身多了一个parent节点,描述了它的父模块的属性值。

  8. 这个parent不仅仅是简单的父子关系描述,存在继承关系,一般我们可以在parent中统一定义依赖或者插件的版本号。

  9. 由于manager本身也是一个聚合工程,因此,manager中的src目录也可以删除。

  10. 然后在manger继续创建maven模块,创建后手动将packaging属性改为jar。

  11. 接下来就是按照这个步骤创建其他不同的业务模块。

  12. 注意:依赖默认是有传递性的。

需要注意的地方,在多模块项目中,web项目打包需要注意以下问题:

  • 不可以直接单独打包。
  • 如果要打包,有两种方式:第一种是先手动将model、dao、service安装到本地仓库。第二种是从聚合工程处打包,即从web的parent处打包。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。