【Java】项目管理工具Maven的安装与使用

news2024/11/25 4:37:38

文章目录

  • 1. Maven概述
  • 2. Maven的下载与安装
    • 2.1 下载
    • 2.2 安装
  • 3. Maven仓库配置
    • 3.1 修改本地仓库配置
    • 3.2 修改远程仓库配置
    • 3.3 修改后的settings.xml
  • 4. 使用Maven创建项目
    • 4.1 手工创建Java项目
    • 4.2 原型创建Java项目
    • 4.3 原型创建Web项目
  • 5. Tomcat启动Web项目
    • 5.1 使用Tomcat插件启动项目
    • 5.2 本地安装Tomcat启动项目
      • 5.2.1 下载并安装Tomcat
      • 5.2.2 本地Tomcat启动项目
  • 6. Maven的依赖管理
    • 6.1 依赖配置
    • 6.2 依赖传递
      • 6.2.1 依赖传递演示
      • 6.2.2 依赖传递冲突
    • 6.3 可选依赖
    • 6.4 排除依赖
    • 6.5 依赖范围
  • 7. 生命周期与插件
    • 7.1 构建生命周期
    • 7.2 插件

1. Maven概述

1.Maven简介:maven是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)。

注:POM(Project Object Model):项目对象模型

maven管理项目流程如下:

在这里插入图片描述

2.Maven的作用

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

3.Maven仓库

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

在这里插入图片描述

4.Maven坐标

  • 坐标概念:Maven中的坐标用于描述仓库中资源的位置
  • 坐标的主要组成
    • groupId:组织id,定义当前Maven项目隶属组织名称(通常是域名反写, 例如:org.mybatis)
    • artifactld:项目id,定义当前Maven项目名称(通常是模块名称, 例如CRM、SMS)
    • version:版本号,定义当前项目版本号
  • 坐标的作用:使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成

2. Maven的下载与安装

2.1 下载

官网下载:

  • 最新版本:https://maven.apache.org/download.cgi
  • 历史版本:https://archive.apache.org/dist/maven/maven-3/

最新版本:

在这里插入图片描述

历史版本:

在这里插入图片描述

2.2 安装

此处下载得到最新的 apache-maven-3.9.3-bin.zip 安装包,放在任意一个文件夹下,右键解压到当前文件夹。

此处我解压到 E:\Applications\apache-maven-3.9.3

在这里插入图片描述

配置环境变量:

1.新建 MAVEN_HOME 环境变量,变量值为maven安装路径

  • 变量名:MAVEN_HOME
  • 变量值:E:\Applications\apache-maven-3.9.3

在这里插入图片描述

2.修改 Path 变量

在 系统变量 中选中 Path 变量后,点击 “编辑” 按钮,随后点击“新建”,输入 %MAVEN_HOME%\bin 即可

在这里插入图片描述

3.输入命令,测试是否安装成功

mvn -v

出现以下界面,表示安装成功:

在这里插入图片描述

3. Maven仓库配置

3.1 修改本地仓库配置

本地仓库:maven启动后,会自动保存下载的资源到本地仓库

  • 默认位置:登录用户名所在目录的.m2文件夹中,如 C:\Users\Admin\.m2\repository(默认保存到C盘)
<localRepository>${user.name}\.m2\repository</localRepository>
  • 自定义位置:修改本地仓库位置为指定路径,如 D:\repository
<localRepository>D:\repository</localRepository>

由于默认保存到C盘,所以要修改本地仓库配置,步骤如下:

1.找到安装包的conf文件夹下的settings.xml文件,使用 vscode 或者其他工具打开它

在这里插入图片描述

2.Ctrl+F搜索 localRepository,复制刚刚的自定义配置到这里即可

在这里插入图片描述

3.2 修改远程仓库配置

远程仓库:为本地仓库提供资源的仓库,资源从远程仓库下载到本地仓库。

1.默认远程仓库:

<repositories>
	<repository>
		<id>central</id>
		<name>Central Repository</name>
		<url>https://repo.maven.apache.org/maven2</url>
		<layout>default</layout>
		<snapshots>
			<enabled>false</enabled>
		</snapshots>
	</repository>
</repositories>

2.镜像远程仓库:

镜像仓库配置:

  • id:镜像的唯一标识,用来区分不同的mirror元素
  • mirrorOf:对哪个仓库进行镜像,简单来说就是替代哪个仓库,此处填为central,也就是替代了默认远程仓库
  • name:镜像名称
  • url:镜像URL

修改镜像仓库地址:修改镜像仓库地址是为了加快下载速度,此处修改为阿里云镜像,远程仓库的地址从国外转到了国内,下载速度自然就快了

<mirrors>
	<mirror>
		<id>nexus-aliyun</id>
		<mirrorOf>central</mirrorOf>
		<name>Nexus aliyun</name>
		<url>http://maven.aliyun.com/nexus/content/groups/public</url>
	</mirror>
</mirrors>

依然还是修改E:\Applications\apache-maven-3.9.3\conf文件夹下的settings.xml文件:

在这里插入图片描述

3.3 修改后的settings.xml

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
    <localRepository>D:\repository</localRepository>
    <mirrors>
        <mirror>
            <id>nexus-aliyun</id>
            <mirrorOf>central</mirrorOf>
            <name>Nexus aliyun</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
    </mirrors>
</settings>

4. 使用Maven创建项目

Maven工程的目录结构如下:左边是Java项目,右边是Web项目。

可以发现Web项目就是比Java项目多了个webapp目录

在这里插入图片描述

4.1 手工创建Java项目

由于 Idea 创建的maven一开始是没有 settings.xml 的,所以每次创建新 maven工程的时候,会使用默认的 settings.xml配置,也就是使用默认的本地仓库地址和远程仓库地地址。

  • 默认本地仓库地址:${user.name}\.m2\repository
  • 默认远程仓库地址:https://repo.maven.apache.org/maven2

前置工作:将上述修改好的 apache-maven-3.9.3\conf\settings.xml文件,复制到${user.name}\.m2\repository文件夹下,则每次创建新 maven项目,会默认使用该配置,可以解决刚启动项目时,下载jar包速度慢的问题。

在这里插入图片描述

1.New Project,创建新项目

在这里插入图片描述

2.填写项目名称等信息,Build System勾选Maven

在这里插入图片描述

手工创建Java项目,得到的Maven工程结构如下:

在这里插入图片描述

3.修改项目的maven配置,打开 Settings并在搜索框输入maven,修改以下内容即可

注:每次创建或导入一个maven项目的时候,maven配置都会使用默认配置,因此每次都需要重新修改它的maven配置

在这里插入图片描述

4.2 原型创建Java项目

ArcheType选择org.apache.maven.archetypes:maven-archetype-quickstart,就能使用原型创建Java工程项目

注:使用原型创建maven项目的方式,会下载一些jar包,所以项目构建需要等待一段时间。

在这里插入图片描述

使用原型创建Java项目,得到的Maven工程结构如下:

在这里插入图片描述

4.3 原型创建Web项目

ArcheType:选择org.apache.maven.archetypes:maven-archetype-webapp,就能使用原型创建 Web工程项目

注:使用原型创建maven项目的方式,会下载一些jar包,所以项目构建需要等待一段时间。

在这里插入图片描述

使用原型创建Web项目,得到的Maven工程结构如下:

在这里插入图片描述

以该Web项目为例,由于其结构缺失,需要手动补充文件夹,使其称为完整的Web项目工程:

  • main目录下新建java目录,并将其标记为 Sources Root
  • src目录下新建test目录,并在test目录下新建java和resources
  • 标记test目录下的java为 Test Sources Root,resources为Test Resources Root

最终Web项目结构如下:

在这里插入图片描述

5. Tomcat启动Web项目

5.1 使用Tomcat插件启动项目

mvnrepository官网地址:https://mvnrepository.com/

1.搜索框中输入tomcat maven,点击Search进行搜索,找到 Apache Tomcat Maven Plugin :: Common API,然后点击org.apache.tomcat.maven链接进入

注意:是点击org.apache.tomcat.maven蓝色链接,而不是点击 Apache Tomcat Maven Plugin :: Common API黑体字,点击黑体字进去的链接是找不到 tomcat 插件的

在这里插入图片描述

在这里插入图片描述

2.Apache Tomcat Maven Plugin :: Tomcat 7.x,点击链接进入,继续选择一个版本点击进入

在这里插入图片描述
在这里插入图片描述

3.得到了Tomcat7插件的 groupId、artifactId、version,并复制到pom.xml中,就完成了插件的安装

在这里插入图片描述

4.最终得到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>com.example</groupId>
  <artifactId>maven-project</artifactId>
  <packaging>war</packaging> <!--打包方式为war包-->
  <version>1.0-SNAPSHOT</version>

  <name>maven-project Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <!--构建项目需要的信息-->
  <build>
    <!--插件列表-->
    <plugins>
        <!--安装tomcat7插件-->
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
        </plugin>
    </plugins>
  </build>

</project>

5.打开maven侧边栏,找到tomcat7插件,点击tomcat7:run,启动tomcat服务器

在这里插入图片描述

6.运行后会在末尾出显示一个链接,就是本地项目的地址,点击该链接即可查看web项目。

在这里插入图片描述

点击 http://localhost:8080/maven-project,弹出页面如下:

在这里插入图片描述

之所以页面会显示Hello World!,是因为使用原型创建web项目时,自动创建了一个index.jsp,内容如下:

在这里插入图片描述

注:如果不想使用默认的8080端口和默认路径,可以进行以下配置修改

<!--构建项目需要的信息-->
<build>
  <!--插件列表-->
  <plugins>
      <!--安装tomcat7插件-->
      <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.2</version>
          <!--配置端口号和路径-->
          <configuration>
              <port>80</port>
              <path>/</path>
          </configuration>
      </plugin>
  </plugins>
</build>

再次启动 tomcat,访问以下地址即可:http://localhost:80/

在这里插入图片描述

另外,还可以进行如下配置操作,用于简化tomcat服务器的启动:

idea右上角,Current File 下拉框选择 Edit Configurations

在这里插入图片描述

点击 + 号,选择 Maven

在这里插入图片描述

填写配置名称、命令行以及选择应用到哪个工程

在这里插入图片描述

以后就可以使用如下方式启动tomcat服务器了

在这里插入图片描述

5.2 本地安装Tomcat启动项目

5.2.1 下载并安装Tomcat

1.下载 tomcat,此处以tomcat9为例

官网地址:https://tomcat.apache.org/

点击左边栏Download下的Tomcat9

在这里插入图片描述

点击 64-bit Windows zip (pgp, sha512)链接进行下载,得到apache-tomcat-9.0.78-windows-x64.zip压缩包

在这里插入图片描述

2.安装 tomcat,把压缩包放到任意一个文件夹下解压,选择解压到当前文件夹,即可安装成功

此处我解压到 E:\Applications\apache-tomcat-9.0.78

在这里插入图片描述

3.配置tomcat环境变量

新建一个变量如下:

  • 变量名:CATALINA_HOME
  • 变量值:E:\Applications\apache-tomcat-9.0.78

在这里插入图片描述

修改path变量,新增 %CATALINA_HOME%\bin

在这里插入图片描述

4.验证是否配置成功:打开cmd,输入 startup.bat回车

注:执行这步之前,先检查其他地方是否关闭了tomcat,否则会出现端口号(8080)占用的情况,导致启动失败(如检查Idea中是否停止运行了tomcat插件)

在这里插入图片描述
在这里插入图片描述

启动完成后,打开浏览器输入 http://localhost:8080,出现如图所示,说明安装配置成功了

在这里插入图片描述

注:上述运行 startup.bat脚本时,出现的乱码问题,可以通过修改 apache-tomcat-9.0.78\conf\logging.properties解决

打开logging.properties文件,搜索 java.util.logging.ConsoleHandler.encoding = UTF-8,把 UTF-8改为GBK即可:

java.util.logging.ConsoleHandler.encoding = GBK

在这里插入图片描述

此时再重启 startup.bat脚本,就没有了乱码问题:

在这里插入图片描述

5.2.2 本地Tomcat启动项目

本地tomcat安装配置完成后,再进行以下三步即可启动web项目:

  • 打包war包
  • 把war包放到 webapps 目录下
  • 启动 startup.bat 脚本

1.打包war包:打开maven侧边栏,找到 Lifecycle,并点击 package,等待构建完成会在target文件夹下生成一个war包,此处为maven-project-1.0-SNAPSHOT.war

在这里插入图片描述

2.将 maven-project-1.0-SNAPSHOT.war 放到 apache-tomcat-9.0.78\webapps文件夹下

在这里插入图片描述

3.启动 startup.bat脚本,启动完成后,在浏览器输入项目地址,即可查看web项目

项目地址组成: http://localhost:8080/,后面再加上war包名称

以我刚刚运行的项目为例,地址就是 http://localhost:8080/maven-project-1.0-SNAPSHOT

在这里插入图片描述

6. Maven的依赖管理

6.1 依赖配置

依赖:指的是当前项目运行所需的jar包,一个项目可以设置多个依赖

<!-- 设置当前项目所依赖的所有jar -->
<dependencies>
    <!-- 设置具体的依赖 -->
    <dependency>
        <groupId>junit</groupId> <!-- 依赖所属群组id -->
        <artifactId>junit</artifactId> <!-- 依赖所属项目id -->
        <version>3.8.1</version> <!-- 依赖版本号 -->
    </dependency>
</dependencies>

6.2 依赖传递

6.2.1 依赖传递演示

依赖具有传递性:

  • 直接依赖:在当前项目中通过依赖配置建立的依赖关系
  • 间接依赖:被依赖具的资源如果依赖其他资源,当前项目间接依赖其他资源

在这里插入图片描述

1.创建一个空项目maven-project,然后在项目下面创建三个模块,分别取名project01project02project03

创建空工程:

在这里插入图片描述

创建三个模块:右键 maven-project -> New -> Module

在这里插入图片描述

最终得到项目结构如下:

在这里插入图片描述

2.对三个模块的pom.xml进行以下修改

  • project01project02project03中分别添加 log4j1.2.121.2.131.2.14 的版本依赖
  • project01中添加junit 4.12版本的依赖
  • project03作为依赖资源添加到project02

注:如果当前项目,想使用另一个项目的东西,那么就把另一个项目作为依赖资源添加到当前项目中

project01pom.xml

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

    <!--project01的项目坐标-->
    <groupId>com.example</groupId>
    <artifactId>project01</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--添加log4j依赖-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <!--添加junit依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

</project>

project02pom.xml

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

    <!--project02的项目坐标-->
    <groupId>com.example</groupId>
    <artifactId>project02</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--添加log4j依赖-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.13</version>
        </dependency>
        <!--添加project03依赖-->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>project03</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

project03pom.xml

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

    <!--project03的项目坐标-->
    <groupId>com.example</groupId>
    <artifactId>project03</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--添加log4j依赖-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.14</version>
        </dependency>
    </dependencies>

</project>

3.以上配置完成后,点击Maven的刷新按钮,可以看到最终依赖的结构如下:

  • 使用红色框圈中的依赖jar包为直接依赖
  • 使用紫色框圈中的依赖jar包为间接依赖

解释:
1.对于project01项目而言,直接依赖了log4j:log4j:1.2.12junit:junit:4.12,间接依赖了 org:hamcrest:hamcrest-core:1.3
2.对于project02项目而言,直接依赖了log4j:log4j:1.2.13com.example:project03:1.0-SNAPSHOT,间接依赖了log4j:log4j:1.2.14
3.对于project03项目而言,直接依赖了log4j:log4j:1.2.14

在这里插入图片描述

6.2.2 依赖传递冲突

依赖传递冲突问题:

  • 路径优先:当依赖中出现相同资源时,层级越深,优先级越低,反之优先级越高。
  • 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖顺序靠后的。

特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的

在这里插入图片描述

1.路径优先:当依赖中出现相同资源时,层级越深,优先级越低,反之优先级越高。

此处project02项目中同时依赖了log4j的1.2.13和1.2.14版本,由于1.2.13是直接依赖,层级更浅,优先级更高,所以最终使用的是1.2.13的版本依赖。

注:idea中log4j的1.2.14版本依赖颜色显示灰色,表示它未生效。

在这里插入图片描述

2.声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖顺序靠后的。

project01project02project03,3个模块项目的pom.xml进行以下修改:

project01pom.xml

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

    <!--project01的项目坐标-->
    <groupId>com.example</groupId>
    <artifactId>project01</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--添加project03依赖-->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>project03</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!--添加project02依赖-->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>project02</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

project02pom.xml

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

    <!--project02的项目坐标-->
    <groupId>com.example</groupId>
    <artifactId>project02</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--添加log4j依赖-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.13</version>
        </dependency>
    </dependencies>

</project>

project03pom.xml

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

    <!--project03的项目坐标-->
    <groupId>com.example</groupId>
    <artifactId>project03</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--添加log4j依赖-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.14</version>
        </dependency>
    </dependencies>

</project>

最终的依赖结构如下:在project01 的pom.xml中,先添加了project03的依赖,后添加了project02的依赖,它们的log4j依赖在同一个层级,由于project03先添加,所以project03log4j 1.2.14依赖生效了。

在这里插入图片描述

3.特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的

project02pom.xml进行以下修改:

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

    <!--project02的项目坐标-->
    <groupId>com.example</groupId>
    <artifactId>project02</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--添加log4j依赖,1.2.13版本-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.13</version>
        </dependency>
        <!--添加log4j依赖,1.2.14版本-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.14</version>
        </dependency>
    </dependencies>

</project>

同一个pom.xml里写了两份一样的依赖,后配置的依赖覆盖前面的,所以此处最终是1.2.14版本的log4j生效。

在这里插入图片描述

6.3 可选依赖

可选依赖:指对外隐藏当前所依赖的资源(不透明)

也就是说,其他使用该依赖资源的人,不知道使用了它,因为该依赖资源被隐藏了

依赖中添加optional配置为true,即可隐藏依赖:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <optional>true</optional> <!--隐藏依赖-->
</dependency>

演示:原始的project01project02的pom.xml配置如下

project01pom.xml

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

    <!--project01的项目坐标-->
    <groupId>com.example</groupId>
    <artifactId>project01</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--添加project02依赖-->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>project02</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

project02pom.xml

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

    <!--project02的项目坐标-->
    <groupId>com.example</groupId>
    <artifactId>project02</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--添加junit依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

</project>

此时能看见junit依赖:

在这里插入图片描述

然后修改project02pom.xml为如下:

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

    <!--project02的项目坐标-->
    <groupId>com.example</groupId>
    <artifactId>project02</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--添加junit依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <optional>true</optional> <!--隐藏依赖-->
        </dependency>
    </dependencies>

</project>

点击刷新按钮后,发现junit依赖不见了(被隐藏了):

在这里插入图片描述

6.4 排除依赖

排除依赖:指主动断开依赖的资源,被排除的资源无需指定版本(不需要)

也就是说,自己不需要使用别人的依赖资源,主动排除了它

依赖中添加exclusion,并指定groupIdartifactId,即可排除依赖:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <exclusions>
        <!--排除依赖-->
        <exclusion>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

演示:修改project01project02pom.xml配置为以下
project01pom.xml

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

    <!--project01的项目坐标-->
    <groupId>com.example</groupId>
    <artifactId>project01</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--添加project02依赖-->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>project02</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

project02pom.xml

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

    <!--project02的项目坐标-->
    <groupId>com.example</groupId>
    <artifactId>project02</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--添加junit依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

</project>

此时能看见junit中还依赖了org.hamcrest:hamcrest-core:1.3

在这里插入图片描述

然后修改project02pom.xml为如下:

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

    <!--project02的项目坐标-->
    <groupId>com.example</groupId>
    <artifactId>project02</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--添加junit依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <exclusions>
                <!--排除依赖-->
                <exclusion>
                    <groupId>org.hamcrest</groupId>
                    <artifactId>hamcrest-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

</project>

点击刷新按钮后,发现org.hamcrest:hamcrest-core:1.3依赖不见了(被排除了):

在这里插入图片描述

6.5 依赖范围

依赖范围:依赖的jar包默认情况下,可以在任何地方使用,可以通过scope标签设定其作用范围。

作用范围:

  • 主程序范围内有效(main文件夹范围内)
  • 测试程序范围内有效(test文件夹范围内)
  • 是否参与打包(package指令范围内)
范围主代码测试代码打包例子
compilelog4j
testjunit
providedservlet-api
runtimejdbc
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope> <!--测试范围-->
</dependency>

注:带有依赖范围的资源在进行传递时,作用范围将受到影响

在这里插入图片描述

7. 生命周期与插件

maven项目构建命令如下:

# 编译
mvn compile

# 清理
mvn clean 

# 测试
mvn test 

# 打包
mvn package 

# 安装到本地仓库
mvn install 

这些maven项目构建命令在Idea中对应的位置如下:

在这里插入图片描述

7.1 构建生命周期

一个典型的 Maven 构建(build)生命周期是由以下几个阶段的序列组成的:
在这里插入图片描述

阶段处理描述
validate验证项目验证项目是否正确且所有必须信息是可用的
compile执行编译源代码编译在此阶段完成
test测试使用适当的单元测试框架(例如junit)运行测试
package打包创建 jar/war 包如在 pom.xml 中定义提及的包
verify检查对集成测试的结果进行检查,以保证质量达标
install安装安装打包的项目到本地仓库,以供其他项目使用
deploy部署拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程

Maven 有以下三个标准的生命周期:

  • clean:项目清理的处理,清理工作
  • default:项目部署的处理,核心工作,例如编译、测试、打包、部署等
  • site:项目站点文档创建的处理,产生报告,发布站点

1.clean 生命周期

生命周期阶段描述
pre-clean执行一些需要在clean之前完成的工作
clean移除所有上一次构建生成的文件
post-clean执行一些需要在clean之后立刻完成的工作

2.default (build) 生命周期

生命周期阶段描述
validate(校验)校验项目是否正确并且所有必要的信息可以完成项目的构建过程
initialize(初始化)初始化构建状态,比如设置属性值
generate-sources(生成源代码)生成包含在编译阶段中的任何源代码
process-sources(处理源代码)处理源代码,比如说,过滤任意值
generate-resources(生成资源文件)生成将会包含在项目包中的资源文件
process-resources (处理资源文件)复制和处理资源到目标目录,为打包阶段最好准备
compile(编译)编译项目的源代码
process-classes(处理类文件)处理编译生成的文件,比如说对Java class文件做字节码改善优化
generate-test-sources(生成测试源代码)生成包含在编译阶段中的任何测试源代码
process-test-sources(处理测试源代码)处理测试源代码,比如说,过滤任意值
generate-test-resources(生成测试资源文件)为测试创建资源文件
process-test-resources(处理测试资源文件)复制和处理测试资源到目标目录
test-compile(编译测试源码)编译测试源代码到测试目标目录
process-test-classes(处理测试类文件)处理测试源码编译生成的文件
test(测试)使用合适的单元测试框架运行测试(Juint是其中之一)
prepare-package(准备打包)在实际打包之前,执行任何的必要的操作为打包做准备
package(打包)将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件
pre-integration-test(集成测试前)在执行集成测试前进行必要的动作,比如说,搭建需要的环境
integration-test(集成测试)处理和部署项目到可以运行集成测试环境中
post-integration-test(集成测试后)在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境
verify (验证)运行任意的检查来验证项目包有效且达到质量标准
install(安装)安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖
deploy(部署)将最终的项目包复制到远程仓库中与其他开发者和项目共享

3.site 生命周期

生命周期阶段描述
pre-site执行一些需要在生成站点文档之前完成的工作
site生成项目的站点文档
post-site执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy将生成的站点文档部署到特定的服务器上

7.2 插件

插件:每个生命周期中都包含着一系列的阶段(phase),这些 phase 就相当于 Maven 提供的统一的接口,然后这些 phase 的实现由 Maven 的插件来完成。

  • 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
  • 默认maven在各个生命周期上绑定有预设的功能
  • 通过插件可以自定义其他功能

我们在输入 mvn 命令的时候 比如 mvn clean,clean 对应的就是 Clean 生命周期中的 clean 阶段,但是 clean 的具体操作是由 maven-clean-plugin 来实现的,所以说 Maven 生命周期的每一个阶段的具体实现都是由 Maven 插件实现的。

插件类型:

类型描述
Build plugins在构建时执行,并在 pom.xml 的 元素中配置
Reporting plugins在网站生成过程中执行,并在 pom.xml 的 元素中配置

常用插件的列表:

插件描述
clean构建之后清理目标文件,删除目标目录
compiler编译 java 源文件
surefile运行 junit单元测试,创建测试报告
jar从当前工程中构建 jar 文件
war从当前工程中构建 war 文件
javadoc为工程生成 javadoc
antrun从构建过程的任意一个阶段中运行一个 ant 任务的集合

插件示例:

<build>
    <plugins>
    	<!--生成源代码的插件-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>3.2.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <phase>generate-test-resources</phase> <!--到生成测试源代码阶段,执行该插件-->
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

点击刷新后可以发现 Plugins下多了个 source插件,就是刚刚添加 maven-source-plugin插件

在这里插入图片描述

测试插件是否有效:由于generate-test-resources阶段在test阶段之前,也就是说执行到test阶段,也必然执行了generate-test-resources阶段,所以,我们点击 Lifecycle下的test按钮,使项目执行到test阶段。

在这里插入图片描述

在这里插入图片描述

可以看到,左侧生成了一个源码的jar包,打开该jar包,就能查看项目的源码。

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/873258.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode150道面试经典题-- 两数之和(简单)

1.题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意…

pytest框架快速进阶篇-pytest前置和pytest后置,skipif跳过用例

一、Pytest的前置和后置方法 1.Pytest可以集成unittest实现前置和后置 importunittestimportpytestclassTestCase(unittest.TestCase):defsetUp(self)->None:print(unittest每个用例前置)deftearDown(self)->None:print(unittest每个用例后置)classmethoddefsetUpClass…

JDK17下载与安装(完整图文教程含安装包)

1.下载JDK17安装包 官网下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/ 同时提供一份网盘下载地址&#xff0c;大家按需自取&#xff1a;点击下载 JDK 所有版本的安装方法都一样&#xff0c;其他版本也不用重复找教程了。 网盘直接放了 JDK 6 – …

Python教程(8)——一文弄懂Python字符串操作(下)

Python字符串操作 字符串常用方法字符串更多方法介绍 字符串常用方法 字符串在编程中是一种不可或缺的数据类型&#xff0c;它在文本和字符数据时提供了丰富而强大的功能。掌握了字符串的使用方法&#xff0c;你能够更加便捷地进行文本处理、数据操作、用户交互等任务&#xf…

存储器分配算法

1.设计目的与要求 1.1设计目的 本设计的目的是使学生了解动态分区分配方式中使用的数据结构和分配算法&#xff0c;并进一步加深对动态分区存储管理方式及其实现过程的理解。 1.2设计要求 用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程malloc()和回收过程…

多表联合查询

1.创建student表 mysql> CREATE TABLE student ( -> id INT(10) NOT NULL UNIQUE PRIMARY KEY , -> name VARCHAR(20) NOT NULL , -> sex VARCHAR(4) , -> birth YEAR, -> department VARCHAR(20) , -> address VARCH…

【AWS 大赛】亚马逊云科技:2023 直冲云霄训练营入营考试报名与答题答案参考

目录 一、报名 &#xff08;1&#xff09;选择 “解决方案架构师-助理级” &#xff08;2&#xff09;未登录先注册账号 &#xff08;3&#xff09;登录 &#xff08;4&#xff09;报名 &#xff08;5&#xff09;报名成功 二、答题 &#xff08;1&#xff09;开始…

FreeRTOS(互斥信号量)

资料来源于硬件家园&#xff1a;资料汇总 - FreeRTOS实时操作系统课程(多任务管理) 目录 一、互斥信号量的定义与应用 1、互斥信号量的定义 2、互斥信号量的应用 3、简要了解递归互斥信号量 二、优先级翻转问题 1、运行条件 2、优先级翻转编程测试 三、互斥信号量的运…

[HDLBits] Exams/m2014 q3

Consider the function f shown in the Karnaugh map below. Implement this function. d is dont-care, which means you may choose to output whatever value is convenient. //empty

[HDLBits] Exams/2012 q1g

Consider the function f shown in the Karnaugh map below. Implement this function. (The original exam question asked for simplified SOP and POS forms of the function.) //

文本三剑客之grep命令和awk命令 1.0 版本

grep awk 1.grep命令1.1 基本格式1.2 常用选项 2.awk命令2.1 awk工作原理2.2 awk命令格式2.3 awk常用内置变量 1.grep命令 1.1 基本格式 grep [选项]… 查找条件 目标文件1.2 常用选项 选项功能 -m [ x ]匹配x次 后停止,x为具体数字-v取反 -i忽略字符大小写 -n显示匹配的 …

GrapeCity Documents for Excel, Java Edition Crack

GrapeCity Documents for Excel, Java Edition Crack 增加了对SpreadJS.sjs文件格式的支持&#xff1a; 更快地将大型Microsoft Excel文件转换为.sjs格式。 使用较小的占用空间保存导出的文件。 将Excel/SpreadJS功能导入SpreadJS/从SpreadJS导出。 从.sjs文件中压缩的JSON文件…

小程序发布注意事项

1、使用HBuildx的 发布 功能发布小程序&#xff0c;因为编译完的代码目录不是同一个 如果使用 运行 到小程序&#xff0c;最后发布的版本会显示”无法连接本地服务器“ 2、使用unicloud的云服务 uniCloud发行 | uni-app官网 阿里云的unicloud的话&#xff0c;使用request域名…

Docker启动、停止、删除容器的相关指令

关闭容器指令&#xff1a; docker stop name启动命令&#xff1a; docker start name删除容器&#xff1a; docker rm name 或 id查看所有容器id&#xff1a; docker ps -aq删除所有容器&#xff1a; docker rm docker ps -aq开启着的容器是不能被删除的。 查看容器信息&…

华为OD机试 - 最长连续子序列 - 双指针(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述备注 四、双指针1、双指针是什么&#xff1f;2、Java双指针算法适合解决哪些问题&#xff1f; 五、解题思路六、Java算法源码七、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专…

GUI、多线程编程、网络编程简介

GUI、多线程编程、网络编程简介 文章目录 GUI简介什么是GUIGUI有什么用使用方法 多线程编程什么是多线程编程多线程编程有什么用提高程序的响应能力提高程序的性能实现异步编程并发数据访问和共享资源实现复杂的算法和任务分解 进行多线程编程的步骤 网络编程什么是网络编程网络…

day6 STM32时钟与定时器

STM32时钟系统的概述 概念 时钟系统是由振荡器&#xff08;信号源&#xff09;、定时唤醒器、分频器等组成的电路。 常用的信号有晶体振荡器和RC振荡器。 意义 时钟是嵌入式系统的脉搏&#xff0c;处理器内核在时钟驱动下完成指令执行&#xff0c;状态变换等动作&#xff…

迪瑞克斯拉算法

迪锐克斯拉算法 简单来说就是在有向图中&#xff0c;给定一个图中具体的出发点&#xff0c;从这个点出发能够到达的所有的点&#xff0c;每个点的最短距离是多少。到不了的点&#xff0c;距离则是正无穷。有向&#xff0c;无负权重&#xff0c;可以有环。 所以说&#xff0c;迪…

Linux 终端命令之文件浏览(4) head, tail

Linux 文件浏览命令 cat, more, less, head, tail&#xff0c;此五个文件浏览类的命令皆为外部命令。 hannHannYang:~$ which cat /usr/bin/cat hannHannYang:~$ which more /usr/bin/more hannHannYang:~$ which less /usr/bin/less hannHannYang:~$ which head /usr/bin/he…

流量日志分析--实操

[鹤城杯 2021]流量分析 <--第一道流量分析不难,主要就是布尔盲注的流量包分析,直接查看http请求包即可我们可以通过观察看到注入成功的响应长度不同,这里成功的为978字节,失败的994字节.不要问为什么.其实也可以直接判断.978的流量比994的少了非常多 显然就是成功的(因为这里…