Maven

什么是Maven?

maven是一个项目构建,依赖管理工具,使用maven工具可以实现自动化构建,测试,打包和发布项目,提高了开发效率

项目构建

指将源代码、配置文件、资源文件等转化为能够运行或部署的应用程序或库的过程

项目构建的过程:清理、编译、测试、报告、打包、部署

打包方式:

  • Java工程打jar包
  • Web工程打war包
点击查看代码
war包打包插件和jdk版本不匹配:需要在pom.xml中添加代码
<build>
    <!-- jdk17 和 war包版本插件不匹配 -->
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.2.2</version>
        </plugin>
    </plugins>
</build>
  • Pom不参与打包,当创建一个父工程的时候,会自动生成pom打包

基于IDEA对mavne进行管理

maven工程的核心信息配置和解读

<!-- 模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
<groupId>com.companyname.project-group</groupId>
<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>project</artifactId>
<!-- 版本号 -->
<version>1.0.0</version>

<!--打包方式
    默认:jar
    jar指的是普通的java项目打包方式! 项目打成jar包!
    war指的是web项目打包方式!项目打成war包!
    pom不会讲项目打包!这个项目作为父工程,被其他工程聚合或者继承!后面会讲解两个概念
-->
<packaging>jar/pom/war</packaging>

maven工程依赖管理配置
maven仓库地址

可以通过编写依赖jar包的gav必要属性,引入第三方jar依赖
scope属性是可选的,表示的是指定依赖的范围

依赖范围 描述 编译时 测试时 运行时 示例依赖
compile 默认依赖范围,用于编译、测试和运行 spring-core
test 仅用于测试阶段的依赖 JUnit
provided 编译和测试时需要,但运行时由环境提供的依赖 servlet-api
runtime 编译时不需要,但测试和运行时需要的依赖 JDBC驱动实现
system provided类似,但需要显式指定依赖文件路径 本地系统库(不常见)
import 仅在<dependencyManagement>中有效,用于导入其他POM的依赖管理 - - - 其他POM文件(不直接对应依赖)

依赖版本的统一提取和维护
我们可以将依赖的版本全部放到
依赖放在中,每一个依赖都需要单独的用包裹起来

<!--声明版本-->
<properties>
  <!--命名随便,内部制定版本号即可!-->
  <junit.version>4.11</junit.version>
  <!-- 也可以通过 maven规定的固定的key,配置maven的参数!如下配置编码格式!-->
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <!--引用properties声明版本 -->
    <version>${junit.version}</version>
  </dependency>
</dependencies>

依赖下载失败错误解决方法

  1. 下载依赖时出现网络故障或仓库服务器宕机等原因,导致无法连接至 Maven 仓库,从而无法下载依赖。
  2. 依赖项的版本号或配置文件中的版本号错误,或者依赖项没有正确定义,导致 Maven 下载的依赖项与实际需要的不一致,从而引发错误。
  3. 本地 Maven 仓库或缓存被污染或损坏,导致 Maven 无法正确地使用现有的依赖项。
    解决方案:
  4. 检查网络连接和 Maven 仓库服务器状态。
  5. 确保依赖项的版本号与项目对应的版本号匹配,并检查 POM 文件中的依赖项是否正确。
  6. 清除本地 Maven 仓库缓存(lastUpdated 文件),因为只要存在lastupdated缓存文件,刷新也不会重新下载。本地仓库中,根据依赖的gav属性依次向下查找文件夹,最终删除内部的文件,刷新重新下载即可!

例如:当我们导入一个Druid的依赖的时候报错

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.2.8</version>
</dependency>

我们需要在本地仓库的目录中去查找依赖的位置
image

Maven工程Build构建配置

1.指定构建打包文件的名称,非默认名称

<!-- 默认的打包名称:artifactid+verson.打包方式 -->
<build>
  <finalName>定义打包名称</finalName>
</build>  

2.制定构建打包时,指定包含文件格式和排除文件

<!--打包指定静态资源-->
<build>
<resources>
    <resource>
      <!-- 指定要打包资源的文件夹 要把哪些静态资源打包到 classes根目录下-->
      <directory>src/main/resources</directory>
      <includes>
        <include>**/*.xml</include>
        <include>**/*.properties</include>
      </includes>
    </resource>
  </resources>
</build>

3.打包插件版本过低,需要配置更高版本插件(或者配置其他常用的插件修改jdk版本、tomcat插件...)

点击查看代码
  <plugins>
      <!-- java编译插件,配jdk的编译版本 -->
      <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>
      <!-- tomcat插件 -->
      <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>
          <server>tomcat7</server>
        </configuration>
      </plugin>
    </plugins>
</build>

Maven依赖传递和依赖冲突

Maven依赖传递特性

image

传递的原则

  • 当依赖的范围是compile的时候,可以传递
  • 当依赖的范围是test或者provided的时候,不能传递

依赖传递终止

  • 范围不是compile的时候终止依赖的传递
  • 当传递过来的jar包已经存在的时候也不传递

Maven工程继承和聚合关系

继承的概念:Maven 继承是指在 Maven 的项目中,让一个项目从另一个项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作。

继承的作用:可以在父工程中统一管理相同的依赖信息

继承的语法
1.在父工程中,因为要去管理子工程所以打包方式必须是pom

点击查看代码
  <groupId>com.atguigu.maven</groupId>
  <artifactId>pro03-maven-parent</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

2.在子工程中需要用标签指定当前工程的父工程,如果子工程的坐标中的groupId和父工程的一致那么可以省略,版本号也可以在父工程中统一管理

点击查看代码
<parent>
  <!-- 父工程的坐标 -->
  <groupId>com.atguigu.maven</groupId>
  <artifactId>pro03-maven-parent</artifactId>
  <version>1.0-SNAPSHOT</version>
</parent>

<!-- 子工程的坐标 -->
<!-- <groupId>com.atguigu.maven</groupId> -->
<artifactId>pro04-maven-module</artifactId>
<!-- <version>1.0-SNAPSHOT</version> -->

Maven工程继承关系

大差不差也是一种依赖传递,但是和依赖传递不同的是,依赖传递的工程之间是平级关系,但是继承是父子关系

父工程统一管理依赖

点击查看代码
<!-- 使用dependencyManagement标签配置对依赖的管理 -->
<!-- 被管理的依赖并没有真正被引入到工程 -->
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.0.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>4.0.0.RELEASE</version>
    </dependency>
  </dependencies>
</dependencyManagement>

Maven工程聚合关系

Maven 聚合是指将多个项目组织到一个父级项目中,以便一起构建和管理的机制。
在创建父子工程的时候,父工程中会默认生成

点击查看代码
<modules>
    <module>child-project1(子工程名)</module>
    <module>child-project2</module>
  </modules>

Maven仓库之间的关系和优先级

仓库的优先级顺序为:本地仓库 > 远程仓库 > 中央仓库

posted @ 2024-10-21 22:54  xxxLin  阅读(32)  评论(0编辑  收藏  举报