Maven集锦

发布时间 2023-08-15 16:18:36作者: 鹿鹿的布丁

https://www.bilibili.com/video/BV1Ah411S7ZE

一、概念

1、什么是Maven

Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(pom)
image.png

2、Maven的作用

  • 项目构建:提供标准的、跨平台的自动化项目构建方式。
  • 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题。
  • 统一开发结构:提供标准的、统一的项目结构

image.png

3、仓库

用于存储资源,包含各种jar包

  • 仓库分类:
    • 本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源
    • 远程仓库:非自己电脑上的仓库,为本地仓库提供资源
      • 中央仓库:Maven团队维护,存储所有资源的仓库
      • 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源
  • 私服的作用:
    • 保存具有版权的资源,包含购买或自主研发的jar
      • 中央仓库中的jar都是开源的,不能存储具有版权的资源
    • 一定范围内共享资源,仅对内部开放,不对外共享

4、坐标

Maven中的坐标用于描述仓库中的资源位置,https://repo1.maven.org/maven2
作用:使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成

主要组成:

  • groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:org.mybatis)
  • artifactId:定义当前Maven项目名称(通常是模块名称,例如:CRM、SMS)
  • version:定义当前项目版本
  • packaging:定义该项目的打包方式

二、配置

1、配置本地仓库地址

默认地址为:${user.home}/.m2/repository
个人比较喜欢把仓库地址设置为maven解压包中,maven为绿色软件,解压后可以直接使用

打开apache-maven-3.6.1/conf/settings.xml
image.png
把上面的<localRepository>/path/to/local/repo</localRepository>移动到注释外
修改为 <localRepository>C:\maven\apache-maven-3.6.1\repository</localRepository>

2、配置远程仓库地址

maven的中央仓库下载的速度慢,使用阿里云的镜像加速下载

<mirrors>
  <!-- 配置具体的仓库的下载镜像 -->
  <mirror>
    <!-- 此镜像的唯一标识符,用来区分不同的mirror元素 -->
    <id>alimaven</id>
    <!-- 对哪个仓库进行镜像,简单说就是替代哪个仓库 -->
    <mirrorOf>central</mirrorOf>
    <!-- 镜像名称-非必要 -->
    <name>aliyun maven</name>
    <!-- 镜像URL -->
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  </mirror>
</mirrors>

3、修改Setting.xml使全局默认使用jdk8

idea中,有些项目会默认是用jdk5什么的,不支持jdk8的版本,每次都需要自己手动设置

在setting.xml中,找到<profiles></profiles>标签,加入下列代码

<!-- 全局设置默认jdk8 -->
		<profile>
			<id>jdk18</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>

三、使用

1、使用tomcat插件启动war项目

使用意义不大。。。

<?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">
  <!--  省略其他配置 .... -->
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
        <!-- 默认访问路径:localhost:8080/<artifactId> -->
        <!-- <configuration>-->
            <!-- <port>80</port>-->
            <!-- <path>/</path>-->
        <!-- </configuration> -->
      </plugin>
      <!-- 下面这个,插件一直是红色的波浪线,使用不了 -->
      <!-- <plugin> -->
      <!-- <groupId>org.apache.tomcat.maven</groupId> -->
      <!-- <artifactId>common-tomcat-maven-plugin</artifactId> -->
      <!-- <version>2.1</version> -->
  		<!-- </plugin> -->
    </plugins>
  </build>
</project>

image.png

2、依赖管理

<?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>  

  <groupId>com.tzcxyh</groupId>
  <artifactId>learn-group</artifactId>
  <version>1.0.0</version>

  <!-- 依赖管理 -->
  <dependencies>
    <!-- 引入具体依赖 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>
  • 依赖传递(依赖具有传递性)
    • 直接依赖:在当前项目中通过依赖配置建立的依赖关系(通过<dependency>标签)
    • 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

learn-group直接依赖了junitlearn-group 间接依赖了 hamcrest-core
junit直接依赖了hamcrest-core。依赖是一个相对概念
image.png

  • 依赖传递冲突问题
    • 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
    • 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖顺序靠后的
    • 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的
  • 可选依赖:对外隐藏当前所依赖的资源(不透明、外部不可使用)
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.13</version>
  <!-- 设置为true表示对外隐藏 -->
  <optional>true</optional>
</dependency>
  • 排除依赖:主动断开依赖的资源,被排除的依赖无需指定版本
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.13</version>
  <exclusions>
    <exclusion>
      <groupId>org.hamcrest</groupId>
      <artifactId>hamcrest-core</artifactId>
    </exclusion>
  </exclusions>
</dependency>