Java学习笔记-全栈-web开发-17-maven


1. 简介

Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。

Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。

Maven最常见的用于就是用来导包

使用eclipse或其他编辑器的,请自行百度下载按照方法,博主使用的IDEA自带maven

2. maven仓库

本地maven仓库默认路径在
C:\Users\电脑用户名.m2\repository

用于存放网上下载到本地的jar包
配置仓库路径在maven的bin目录下的config/settings.xml
在这里插入图片描述
maven会默认从中央仓库(可以理解为maven提供的官方仓库)下载jar包到本地。

官网的仓库一般下载都太慢了,可以配置国内仓库。

在setting.xml的mirrors中更改如下:


     <!-- 阿里云仓库 -->
        <mirror>
            <id>alimaven</id>
            <mirrorOf>central</mirrorOf>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
        </mirror>
    
        <!-- 中央仓库1 -->
        <mirror>
            <id>repo1</id>
            <mirrorOf>central</mirrorOf>
            <name>Human Readable Name for this Mirror.</name>
            <url>http://repo1.maven.org/maven2/</url>
        </mirror>
    
        <!-- 中央仓库2 -->
        <mirror>
            <id>repo2</id>
            <mirrorOf>central</mirrorOf>
            <name>Human Readable Name for this Mirror.</name>
            <url>http://repo2.maven.org/maven2/</url>
        </mirror>

3. 创建maven工程

先用IDEA创建maven工程
在这里插入图片描述在这里插入图片描述

  • GroupId:顾名思义,这个项目属于哪个组,自己按需求写,新手学习一般来说没有组可严,可以写com.test.demo
  • ArtifactId:表示这个项目的唯一ID,一般来说就是项目名称

在这里插入图片描述创建完毕之后,会看到一个pom.xml文件,这就是maven管理的核心。

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
</dependencies>

上面这句话的意思就是导入junit包的意思。

点击Enable Auto-Import,以后导入的依赖会自动下载。

4. 坐标

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
</dependencies>

这个xml代码,就是一个maven坐标,表示junit4.10的坐标,通过坐标定位一个唯一确定的jar包

  • groupId:定义当前Maven组织名称
  • artifactId:定义实际项目名称
  • version:定义当前项目的当前版本

坐标的查找,在maven仓库中搜索即可。

由坐标的概念,很容易知道,可以进行“项目与项目之间的引用”,只需要在某个项目的pom中添加创建项目时填写的
在这里插入图片描述即可。

简称GAV

5. 常用命令

maven可以使用终端命令行,但是IDEA集成了maven工具,因此,我们可以直接使用。
在这里插入图片描述

在上图“3”处即可写以下maven命令。
如果使用终端,cd到项目路径即可

mvn compile

  • 完成编译操作
  • 执行完毕后,会生成target目录,该目录中存放了编译后的字节码文件。

mvn clean

  • 执行完毕后,会将target目录删除。

mvn test

  • 完成单元测试操作
  • 执行完毕后,会在target目录中生成三个文件夹:surefire、surefire-reports(测试报告)、test-classes(测试的字节码文件)

mvn package

  • 完成打包操作
  • 执行完毕后,会在target目录中生成一个文件,该文件可能是jar、war

mvn install

  • 执行 mvn install命令,完成将打好的jar包安装到本地仓库的操作
  • 执行完毕后,会在本地仓库中出现安装后的jar包,方便其他工程引用

mvn 组合命令

  • mvn clean compile
  • mvn clean test
  • mvn clean package
  • mvn clean install

6. 依赖管理

6.1 依赖范围 – scope

scope表示通过该依赖引入的jar包的生效范围(也作用来控制依赖和编译,测试,运行的classpath的关系)。

在这里插入图片描述
主要的是三种依赖关系如下:

  • compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
  • test:测试依赖范围。只对于测试classpath有效
  • provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api(最常见的是用于“排除打包”,比如springboot自带tomcat,若想打包后使用其他服务器,则需要将springboot自带的tomcat的scope设置为provided
  • runtime:运行时提供。例如:jdbc驱动

scope的默认值是compile


6.2 依赖传递

不必死记硬背,自然而然地理解即可。
test1依赖了test2,test2依赖了test3,因此test1也会依赖test3。
test1与test3称为“间接依赖”;
其他称为“直接依赖”

在这里插入图片描述
当第二依赖的范围是compile的时候,依赖可以传递
当第二直接依赖的范围是test的时候,依赖不会得以传递

6.3 依赖冲突(常见)

  • 假如test1使用junit4.10依赖,并且scope是compile,那test2,test3都可以使用test1的junit4.10,因为传递下来了
  • 假如test2使用junit4.9依赖,那test3会使用【就近的一个依赖】,也就是使用junit4.9

也就是就近原则

6.4 可选依赖(是否不传递依赖)

<optional> true/false<optional> 是否可选,也可以理解为是否向下传递。
如果是true则不传递依赖,如果是false就传递,默认为false。

6.5 排除依赖(常用)

exclusions可用于排除依赖(注意exclusions写在dependency中)
比较常见的是,比如springboot自带的日志系统是logback(logging),而我们要用log4j2,则需要将logback排除。

<exclusions>
    <exclusion>
        <artifactId>spring-boot-starter-logging</artifactId>
        <groupId>org.springframework.boot</groupId>
    </exclusion>
</exclusions>

此外,A依赖B,B依赖C,因此A也依赖了C。但实际情况中A可能不需要C,因此可以在A中将C排除。

7. maven生命周期(理解)

Maven生命周期就是为了对所有的构建过程进行抽象和统一。
包括项目清理、初始化、编译、打包、测试、部署等几乎所有构建步骤。
生命周期可以理解为构建工程的步骤。

在Maven中有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:
Clean Lifecycle: 在进行真正的构建之前进行一些清理工作。
Default Lifecycle: 构建的核心部分,编译,测试,打包,部署等等。
Site Lifecycle: 生成项目报告,站点,发布站点。

7.1 Clean生命周期:清理项目

Clean生命周期一共包含了三个阶段:
pre-clean 执行一些需要在clean之前完成的工作
clean 移除所有上一次构建生成的文件
post-clean 执行一些需要在clean之后立刻完成的工作

也就是说,mvn clean 等同于 mvn pre-clean clean
如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。
这是Maven很重要的一个规则,可以大大简化命令行的输入。

7.2 Default生命周期:构造项目

Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段

  • validate
  • generate-sources
  • process-sources
  • generate-resources
  • process-resources 复制并处理资源文件,至目标目录,准备打包。
  • compile 编译项目的源代码。
  • process-classes
  • generate-test-sources
  • process-test-sources
  • generate-test-resources
  • process-test-resources 复制并处理资源文件,至目标测试目录。
  • test-compile 编译测试源代码。
  • process-test-classes
  • test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
  • prepare-package
  • package 接受编译好的代码,打包成可发布的格式,如 JAR 。
  • pre-integration-test
  • integration-test
  • post-integration-test
  • verify
  • install 将包安装至本地仓库,以让其它项目依赖。
  • deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享

运行任何一个阶段的时候,它前面的所有阶段都会被运行
(这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包,安装到本地仓库)

此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要。

7.3 Sit生命周期:生成项目站点(了解)

这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能
Manager比较喜欢,文档及统计数据自动生成,很好看。我们就不用学,以后自己研究

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

8. maven 插件plugins

plugins就是插件的意思,可以通过maven引入一些插件来实现特殊功能。

指定jdk版本

<!--build与dependencies是平级的-->
<build>
	<plugins>
		<groupId>org.apache.maven.plugins</groupId>
		<artifactId>maven-compiler-plugin</artifactId>
		<configuration>
			<source>1.8></sourcec>
			<target>1.8></target>
			<encoding>UTF-8</encoding>
		</configuration>
	</plugins>
</build>

mybatis自动生成插件

<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.3.1</version>
    <configuration>
        <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
        <overwrite>true</overwrite>
        <verbose>true</verbose>
    </configuration>
</plugin>

外部war包打包配置

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        
<!--                    <includeSystemScope>true</includeSystemScope>-->
        <mainClass>xyz.shunxu.DaidiweiApplication</mainClass>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

9. 继承

继承是为了消除重复,可以把很多相同的配置提取出来。例如:grouptId,version等。

父工程只用于写pom文件。


9.1 创建父工程

在这里插入图片描述

9.2 创建子工程

在子工程中指定Parent Project即可。

在这里插入图片描述

9.3 父工程统一管理依赖

在父工程中通过配置dependencies依赖,子工程可以直接继承使用,如下图
在这里插入图片描述在父工程中通过配置dependencyManagement管理依赖的版本号。
注意:此处只是定义依赖jar包的版本号,并不实际依赖。如果子工程中需要依赖jar包还需要添加dependency节点。

在这里插入图片描述

9.4 父工程提取版本号

当父工程中定义的jar包越来越多,找起来越来越麻烦,所以可以把版本号提取成一个属性集中管理。

在父工程的pom.xml中配置一个properties标签,里面的标签自己自定义即可

在这里插入图片描述

9.5 springboot中的父工程(了解)

在springboot项目的pom.xml中的最上方,就可以看到项目的父工程是spring-boot-starter-parent
在这里插入图片描述我们可以点进去看看,发现在最上方依旧还有一个父工程spring-boot-dependencies
在这里插入图片描述
我们继续点进去。
在这里插入图片描述可以看到,这里定义了非常多的版本号。
因此,spring-boot-dependencies定义过的版本号,我们都不需要再指定版本

10. 项目聚合(重要)

聚合一般是一个工程拆分成多个模块开发,每个模块是一个独立的工程,但是要是运行时必须把所有模块聚合到一起才是一个完整的工程,此时可以使用maven的聚合工程。

例如电商项目中,包括商品模块、订单模块、用户模块等。就可以对不同的模块单独创建工程,最终在打包时,将不同的模块聚合到一起。

例如同一个项目中的表现层、业务层、持久层,也可以分层创建不同的工程,最后打包运行时,再聚合到一起。

10.1 创建聚合项目(Springboot)

创建非springboot聚合项目请参考链接

聚合模块的创建的packaging也是使用pom,GroupId和ArtifaceID根据项目来写。

假设现在通过对一个电商项目进行聚合划分。

10.1.1 创建父工程

创建一个空的SpringInitializr项目

在这里插入图片描述注意Artifact不能存在大写

父工程仅用于编辑pom.xml,将多余的文件删除
在这里插入图片描述

将打包方式改成pom
在这里插入图片描述

10.1.2 创建子工程

在这里插入图片描述同样是选择SpringInitializr

在这里插入图片描述在这里插入图片描述在这里插入图片描述将父工程改成platform
在这里插入图片描述可将多余的springboot依赖删除,从父工程中自动引入即可。

父工程添加子模块
在这里插入图片描述

同理,依次创建其他模块即可。注意更改子模块的parent以及父工程中引入子模块即可。

10.2 模块引用

模块之间的互相引用,只需要加上对方的maven坐标即可。

在这里插入图片描述

10.3 模块打包

直接对父工程进行maven打包即可,然后所有的子模块都会生成响应的target文件,模块引用也会自动实现对模块间的引用打包。
比如web模块引用了其他所有模块,最终运行web模块中的target下的jar包即可。

10.4 推荐阅读

maven聚合项目

11. maven仓库

用来统一存储所有Maven共享构建的位置就是仓库。

仓库包括:

  • 本地仓库

    • ~/.m2/repository每个用户只有一个本地仓库
  • 远程仓库

    • 中央仓库:Maven默认的远程仓库,不包含版权资源 http://repo1.maven.org/maven2
      但是中央仓库地址一般都下载比较慢时,可以换成阿里云的中央仓库
      http://maven.aliyun.com/nexus/content/repositories/central/
      也可以自己抢建一个仓库服务器来下载依赖

    • 私服:是一种特殊的远程仓库,它是架设在局域网内的仓库

在这里插入图片描述nexus就是用来创建maven的私服的,也就是提高依赖的下载速度,(其实我们用阿里云的私服就好了)

更改IDEA默认仓库以及镜像

想要修改Maven默认的下载仓库,其实我们只需要找到Maven的settings.xml文件。

如果使用的是IDEA默认的Maven,那么settings.xml默认存放地址为IDEA安装路劲下的:
\JetBrains\IntelliJ IDEA xxx.xxx\plugins\maven\lib\maven3\conf

复制一份settings.xml 到:C:\Users\You user.m2(默认本地存放下载的jar包位置为当前用户文件下下的.m2文件中)下也就是你的本地maven仓库下。

修改settings.xml 文件,找到 标签,并添加如下阿里maven仓库配置:

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

最后修改 IDEA 中的配置File----> settings --> Build,Executon,Deployment --> Maven:选择你settings.xml文件路径,勾选 Override 便可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值