Loading

maven

为什么需要maven

  • 解决jar包之间的冲突
  • jar包之间的依赖关系
  • 获取第三方jar包更方便
  • 将项目拆分为多个工程模板
  • 实现项目的分布式部署

自动化构建工具

清理→编译→测试→报告→打包→安装→部署

maven的核心概念

  • POM(项目对象模型)
  • 约定的目录结构
  • 坐标(groupId、artifactId、version)
  • 依赖管理(dependency标签)
  • 仓库管理
  • 生命周期

修改本地仓库地址

打开apache-maven-3.6.3/conf下的setting.xml,修改localRepositosy标签设置本地仓库地址

约定的目录结构

坐标

  • groupId:公司或组织域名的倒序+当前项目名称
  • artifactId:当前项目的模块名称
  • version:版本

如何通过坐标到仓库中寻找jar包

  • 将gav向量拼接起来,groupId/artifactId/version/artifactId-version.jar
  • 以连起来的字符串作为目录结构到仓库中去查找

仓库

  • 本地仓库
  • 远程仓库(局域网内的私服、中央仓库、中央仓库的镜像)

仓库中的文件

  • maven中的插件
  • 自己开发的项目模块
  • 第三方的jar包

生命周期

  • clean生命周期  pre-clean→clean→post-clean
  • site生命周期  pre-site→site→post-site→site-deploy
  • default生命周期  complie→test-compile→test→package→install

手动创建的maven工程导入到eclipse中

右键→Import→Maven→Existing Maven project

jar包依赖的范围

  • compile
    main和test目录下的代码都可以访问,会部署到服务器运行时要放在WEB-INF的lib目录下
  • test
    仅test目录下的代码可以访问,不会部署到服务器运行时要放在WEB-INF的lib目录下
    例如:对junit的依赖,仅仅是测试程序需要
  • provided
    main和test目录下的代码都可以访问,不会部署到服务器运行时要放在WEB-INF的lib目录下
    例如:servlet-api在服务器上运行时,servlet容器会提供相应的api,所以部署的时候不需要

依赖的传递性

  • Q:当存在间接依赖时,主工程对间接依赖的jar包可以访问吗?
  • A:只有间接依赖的jar包范围为compile,才可以访问

依赖原则

  • 路径最短者优先
    A依赖于B,B依赖于C,B与C依赖的jar包版本不同,这时A所依赖的jar包版本取决于B。
  • 路径相同时先声明者有限
    A依赖于B,A又依赖于C,B与C依赖的jar包版本不同,这时A所依赖的jar包版本取决于在依赖时B与C中先声明者。

exclusions可以排除间接依赖

继承

如果需要统一多个模块的jar包版本,则需创建父工程,在父工程中配置jar包的版本,在子工程中引用父工程。创建父工程时打包方式为pom,子工程的打包方式为jar。若子工程的gav与父工程一样,则可以删除。
父工程中的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.atguigu.maven</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <!-- 通过继承管理依赖 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.0</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

子工程中的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!-- 设置父工程 -->
    <parent>
        <groupId>com.atguigu.maven</groupId>
        <artifactId>parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <!-- 从当前工程出发查询父工程中pom.xml文件的 相对路径 -->
        <relativePath>../parent/pom.xml</relativePath>
    </parent>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>
    <artifactId>son</artifactId>
</project>

聚合

将多个工程拆分成模块后,需要手动逐个安装到仓库才能够生效,修改源代码后也需要逐个手动进行clean,而使用聚合可以批量进行maven工程的安装

<modules>
    <module>../Hello</module>
    <module>../HelloFriend</module>
    <module>../OurFriend</module>
</modules>
posted @ 2020-10-20 22:09  天使的羽翼  阅读(98)  评论(0编辑  收藏  举报