Maven概念

Maven是一个基于Java平台的自动化构建工具,将原材料(java、js、css、html、图片)->产品(可发布项目)

常见的自动化构建工具:make-ant-maven-gradle

Maven作用

  1. 增加第三方jar(中央仓库/镜像->本地仓库),并自动关联下载jar包间所依赖的jar包且不冲突。
  2. 讲项目拆分成若干模块

主要功能

  • 清理:删除编译的结果,为重新编译做准备
  • 编译:java->class
  • 测试:针对于项目中的关键点进行单元测试,亦可用项目中的测试代码去测试开发代码
  • 报告:将测试的结果进行显示
  • 打包:将项目中包含的多个文件压缩成一个文件,用于安装或部署。(java项目-jar、web项目-war)
  • 安装:将打成的包放到本地仓库,供其他项目使用
  • 部署:将打成的包放到服务器上准备运行

配置

  1. 配置JAVA_HOME:C:\java\jdk18
  2. 配置MAVEN_HOME:F:\apache-maven-3.5.3
  3. 配置path:%MAVEN_HOME%\bin
  4. cmd验证:mvn -v
  5. 配置本地仓库——maven目录/conf/settings.xml
    默认本地仓库:C:/Users/CTX/.m2/repository
    修改本地仓库:<localRepository>e:/report</localRepository>
  6. IDEA(/Eclipse)中——settings——Maven中指定文件信息

常用命令(必须在pom.xml所在目录中执行命令)

mvn compile:编译,只编译main目录中的java文件
mvn test:测试
mvn package:打成jar/war
mvn install:将开发的模块放入本地仓库,供其他模块使用(放入的位置是通过gav决定)
mvn clean:删除target目录(删除编译文件的目录)


依赖

依赖有效性

Maven依赖分为三种类型:compile(默认)testprovided,在<dependency>中的<scope>定义.
Maven在编译、测试、运行项目时,各自使用一套classpath.
【强调】:在Eclipse中,pom.xml中增加完依赖后需要右击项目-maven-update project

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>

依赖有效性

依赖排除

若A.jar依赖于B.jar,当我们通过maven引入A.jar时,会自动引入B.jar

【场景】:A.jar(x.java, y.java, z.java)、B.jar(a.java, b.java, c.java)
若A.jar和B.jar之间的依赖的本质是:x.java依赖于a.java,且我们已知A.jar的使用中不需要用到x.java,则可以把B.java的依赖排除

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.7.RELEASE</version>
    <!-- 排除依赖 beans -->
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </exclusion>
    </exclusions>
</dependency>

依赖传递

A.jar->B.jar->C.jar
要使 A.jar->C.jar :当且仅当 B.jar 依赖于C.jar的范围是compile(项目模块一依赖于项目模块二,则一中会自动引入二中所需的各种jar包)

依赖原则

  1. 路径最短优先原则
  2. 路径长度相同:

    • 在同一个pom.xml文件中有2个相同的依赖(覆盖):后面声明的依赖会覆盖前面声明的依赖 (严禁使用本情况,严禁在同一个pom中声明2个版本不同的依赖)
    • 如果是不同的pom.xml中有2个相同的依赖(优先):则先声明的依赖 ,会覆盖后声明的依赖

统一JDK、依赖版本

<profiles>
    <!-- 统一JDK版本 -->
    <profile>  
        <id>jdk-18</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>  
        </properties>   
    </profile>  
    <!-- 统一依赖版本,${junit.version} -->
    <junit.version>4.0</junit.version>
</profiles>

继承

父类

  1. 父工程的打包方式为pom(jar/war/pom)
  2. 在父工程的pom.xml中编写依赖
<dependencyManagement>
      <dependencies>
          <dependency>
          </dependency>
      </dependencies>
</dependencyManagement>

子类

在子类gav下加入父工程坐标和当前到父工程pom.xml的相对路径,并声明要使用到的依赖ga

<parent>
      <!-- 1加入父工程坐标gav -->
      <groupId>cn.ctx.maven</groupId>
     <artifactId>A</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <!-- 2当前工程的Pom.xml到父工程的Pom.xml之间的 相对路径 --> 
     <relativePath>../A/pom.xml</relativePath>
</parent>
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>
</dependencies>

聚合(总工程打包方式为pom)

Maven项目能够识别的:自身包含、本地仓库中的。
Maven1依赖于Maven2、Maven3、...,则在执行时:必须先将Maven2、Maven3、...加入到本地仓库(install),之后才能执行Maven1。以上前置工程的install操作,可以交由“聚合” 一次性搞定。
配置完聚合之后,以后只要操作总工程,则会自动操作该聚合中配置过的工程(可以不按顺序)

<modules>
    <!--项目的根路径  -->
    <module>../Maven2</module>
    <module>../Maven3</module>
</modules>

Maven生命周期

生命周期和构建的关系:假设生命周期中的顺序:a-b-c-d-e,当我们执行c命令,则实际执行的是 a-b-c

三阶段

  1. clean lifecycle:清理
    包括:pre-cleancleanpost-clearn
  2. default lifecycle:默认(常用)
    详见下图
  3. site lifecycle:站点
    包括:pre-sitesitepost-sitesite-deploy

Last modification:April 13th, 2020 at 08:51 pm
喵ฅฅ