Maven在工作中的使用
Maven是什么?
Maven 翻译为"专家"、“内行”,是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
为什么我们要在工作中使用Maven?
在一个Java项目中,我们通常会导入很多框架的依赖,当我们不使用Maven的时候,我们都需要手动将这些依赖放到我们项目中,这就需要程序员很明确的知道要使用什么框架就需要导入什么样的包,当我们下载依赖的时候,一般都是去网上搜索相关的依赖包,有一些依赖是不正规的,可能下载完毕并不能正常使用。就导致可能感觉依赖包都差不多,但是各个框架,各个版本五花八门,很有可能一不小心就搞错了。Maven就可以帮我们管理,统一依赖的包,避免上面的所有问题。当然了,学习完Maven也可以去学习一下Gradle,这是一个比Maven还要新一些的项目管理工具。
Maven配置:
首先我们需要去官网下载一个Maven,网址由于版权原因就上网查找一下吧,下载之后呢,我们就需要配置Maven的环境变量。
首先我们要检查是否配置了JDK的环境变量,因为Maven也是一个用Java写的文件。
用户变量(配置M2_HOME可以减少一些莫名其妙的错误):
变量名:MAVEN_HOME或M2_HOME
变量值:即maven的文件夹所在路径(Maven文件bin目录的上一级)
变量名:path
变量值:级Maven文件的bin目录所在路径
这里说一下在电脑中的环境变量有两种,一种是用户变量,一种是系统变量,这两种的区别就是,用户变量针对的是目前登录的用户设置的变量,系统变量是针对笔记本本身设置的变量,也就是说用户变量换个账号登录则不生效,系统变量则每一次开机都会生效。
验证,当我们配置以后,打开电脑在使用cmd命令行,输入mvn -v 查看当前安装Maven的版本,同时也是检查Maven是否安装成功。
显示如下则配置成功
Maven常用命令(执行构建相关的Maven命令,需要进入pom.xml所在目录):
功能名 | 英文单词 |
---|---|
清理(清理target文件内容) | mvn clean |
编译主程序(会将src路径的打包成一个target-编译后文件) | mvn compile |
编译测试程序(会将test路径的打包成一个target-编译后文件) | mvn test-compile |
执行测试 | mvn test |
打包(会在target中生成一个jar包,就是项目打包后的内容) | mvn package |
将项目放入本地仓库(安装,用于将父工程导入Maven本地仓库,使子工程能够引入父工程作为依赖) | mvn install |
生成当前Maven项目信息的Html站点文件(很慢) | mvn site |
Maven约定的目录结构:
这里的src指的就是源代码,英文全称为(Source code)
设置标准的目录结构是为了让Maven可以实现自动化编译,他必须要知道Java源文件的位置,才能进行编译。
我们执行编译后,Maven会自动去本地仓库寻找依赖,当没有找到依赖的时候,就会去远程下载所需要的依赖。
本地仓库所在位置为:当前用户的家目录.m2\repository目录内(家目录就是C盘下面有一个用户的文件夹,每个人都不一样,有可能是admin,有可能是Administrator,还有可能是你自己设置的名)。
Maven修改默认仓库:
如果不能联网进行远程下载依赖,可以使用我们提前准备好的内容,只要修改默认的本地仓库的位置就可以了。
1.找到Maven文件\conf\setting.xml文件。
2.找到setting文件中的localRepository标签。
3.将标签从注释中取出。
4.将标签中内容替换成我们依赖包存放的文件夹路径。
修改Maven默认JDK版本(指定Maven项目使用的JDK版本):
1.同样找到Maven文件\conf\setting.xml文件。
2.找到setting.xml文件中的profiles标签
3.加入如下配置(jdk1.8 如果识别不了就应该是因为Maven版本有点低,下载一个新一点的版本就可以了):
<profile>
<id>jdk-1.8</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>
Maven中的坐标:
在数学中空间坐标可以通过X,Y,Z三个向量确定空间中的一个具体的位置。在Maven中也是如此,只不过不使用X,Y,Z来判断了,而是使用groupid, artifactid,version三个向量来代表一个坐标。
这三个都是什么意思呢?
1.groupid:公司组织的意思,一般为公司组织的倒序+项目名。
2.artifactid:特征的意思,在Maven中可以表示模块的名称。
3.version:版本号,一个模块的各个版本。
这里说一下版本号的构成,一般版本号为:
这里面用句号分隔的代表的是主版本号,次版本号,增强版本号,里程碑版本号。
名字 | 意义 |
---|---|
主版本号 | 重大重构(一般情况各个主版本号可能互不兼容) |
次版本号 | 新功能添加及变化(一般情况会兼容,添加了新的功能) |
增强版本号 | Bug修复及优化(修改了已知的Bug以及对于功能的优化) |
里程碑版本号 | 英文单词,代表此版本的稳定性 |
以下为里程碑版本号的单词所代表的意义:
Snapshot: 版本代表不稳定、尚处于开发中的版本 Alpha: 内部版本 Beta: 测试版 Demo: 演示版 Enhance: 增强版 Free: 自由版 Full Version: 完整版,即正式版 LTS: 长期维护版本 Release: 发行版 RC: 即将作为正式版发布 Standard: 标准版 Ultimate: 旗舰版 Upgrade: 升级版
由于groupid,artifactid,version这三个向量是以GAV开头,所以说到GAV也是指Maven中的坐标。
Maven坐标与本地仓库中依赖包所在位置关系:
Maven依赖包在本地仓库所在位置为:本地仓库根目录 / groupId / artifactId / version / artifactid-version.jar。
Maven仓库的类型:
本地仓库:为当前电脑提供依赖包及插件。
私服:为局域网内所有电脑提供依赖包及插件(用于范围内只有少数电脑能连接外网的时候)。
中央仓库:为全世界的Maven工程提供服务。
中央仓库镜像:为了分担中央仓库的访问压力。
本地仓库中会保存Maven自身需要的插件,第三方的框架及jar包,最后还有我们自己开发的Maven工程。
如果我们需要让自己的Maven项目B可以使用Maven项目A中的内容与方法,我们就需要使用Maven命令,将Maven项目A放入本地仓库。步骤为:
1.在需要放入仓库的项目根目录下打开cmd命令行。
2.输入mvn install命令就可以将我们自己项目放入本地仓库中。
Maven坐标中的 <scope> 标签:
表示依赖的可见范围。
常用的有一下几种:
可见范围 | 名称 |
---|---|
主程序与测试程序可见(参与打包,是Maven默认的可见范围) | compile |
测试程序可见,主程序不可见(不参与打包) | test |
开发时可见,部署及运行时不可见(不参与打包。比如一些服务器就包含的jar包,但是开发的时候我们要用自己本地的,这时候部署及运行时就不需要本地的jar包了,否则会有冲突) | provided |
Maven也是单一继承,当我们需要多继承的时候我们就可以使用他,他要与type标签一起使用,type标签中内容必须为pom,(工作中会使用到) | import |
Maven项目的构建流程,Maven生命周期(尚硅谷视频):
Maven导入自己的工程的两种方式:
一种是正常导入,一种是继承。
继承导入是使用 <parent> 标签进行导入。
继承导入的父工程是用来统一版本号以及进行依赖包管理的,父工程的打包方式必须要使用POM方式(为pom包)。
<parent>
<!-- 父工程的坐标-->
<groupId>com.maven</groupId>
<artifactId>parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 以当前文件为基准的父工程pom.xml文件的相对路径(可写可不写,最好写上)-->
<relativePath>../parent/pom.xml</relativePath>>
</parent>
直接导入的方式
Maven中依赖是有传递性的
当我们直接导入了自己的工程,工程中的依赖也会自动被导入(非compile范围的不会自动导入)。
导入工程失败的话,是因为Maven找不到直接导入的工程的坐标,原因就是工程的坐标没有在本地仓库中也没有在中央仓库中,需要将工程install安装到本地仓库中。
排除导入工程等传递性原因自动导入的jar包:
在导入的需要排除的jar包的坐标位置标签中,添加
<exclusions>
<exclusion>
<groupId> </groupId>
<artifactId> </artifactId>
</exclusion>
</exclusions>
就可以排除自动导入的jar包(会影响自己的依赖及自己的子项目的依赖)。
如果Maven项目的直接导入工程与间接工程有相同但是版本不同的依赖,并不是谁的版本新用谁的,而是就近原则,会优先选择直接导入工程中的依赖。
如果两个相同的包的距离都一样,则会采取先声明优先 ,会采取POM.xml文件中声明的顺序。
统一配置版本号:
当我们使用Maven导入依赖包的时候,一个POM.xml文件需要导入很多的坐标,这时候我们管理版本号的时候就很费时费力,这时候我们可以 使用<properties>标签 统一声明版本号。然后在每个具体的包的<version>标签中使用 ${自定义标签的名字},来统一配置。
<!-- 统一导入版本 -->
<properties>
<fastjson.version>1.2.58</fastjson.version>
</properties>
<!-- 坐标 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
继承导入的方式
父工程统一版本号(注意:作为统一版本号的工程,打包要使用打成pom包的方式):
在工作中有时候会遇到一种情况,就是父工程用的都是一个,但是子工程各自负责不同的项目,可能我的工程就用不到父工程中的某个依赖,所以就不需要多余导入。
还有一种情况,就是每个项目都有自己的依赖,例如junit,他的可见范围是test,不参与打包环节,所以每个项目的版本都有可能不同,便于管理,我们就需要在父工程中统一版本号,使用时只需要导入 <groupId> 与 <artifaceId> 即可。
父工程中如何统一配置管理依赖:
使用 <dependencyManagement> (管理者)标签来进行统一管理。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependencies>
</dependencyManagement>
聚合
当我们继承父工程或者导入自己的其他工程时,需要先执行父工程的install安装,这是我们才可以正常安装他的子工程,那我们有没有类似一键安装的方法呢?聚合就是这种方法,他就是用来一键安装各个模块的工程的。
我们可以在父工程的pom.xml文件中进行如下配置:
<modules>
<!-- 相对路径,当我们install安装父工程时,会直接安装<module>标签中对应的子工程 -->
<module>../子工程名</module>
<module>../子工程名</module>
</modules>
我们写了一个项目的目的,最终是希望将项目复制到远程仓库,让其他开发人员进行项目共享,或者是部署到服务器上。
所以在项目的pom.xml文件中我们要进行设置,如果需要其他配置可以再自行学习。
<!-- 配置当前工程构建过程中的特殊设置-->
<build>
<!-- 工程最终的名字-->
<finalName>finalName</finalName>
<!-- 配置构建过程中需要使用的启动Servlet容器的插件-->
<plugins>
<plugin>
<groupId>启动Servlet容器的groupId</groupId>
<artifactId>启动Servlet容器的artifactId</artifactId>
<!--针对启动的插件做的配置-->
<configuration>
<!--true表示maven打包时会将外部引入的jar包(比如在根目录下或resource文件下新加外部jar包)打包到项目jar
在服务器上项目才能运行,不加此配置,因为本地可以在lib下找到外部包,本地可以运行,但是服务器上jar中是没有的-->
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>
SpringBoot进行打包运行
我们在项目中可以使用maven的package功能,将SpringBoot项目打成一个jar包,在命令行运行java -jar 包名.jar就可以直接运行一个SpringBoot项目。
我这里使用的是IDEA集成的maven打包方式。
打包后我们可以在SpringBoot项目中的target目录下找到我们打包后的jar包。
最后我们在控制台运行java -jar .\helloworld-0.0.1-SNAPSHOT.jar命令即可
关闭控制台SpringBoot项目就会停止服务。
这是针对我自己认识到的Maven做的一个理解,希望看完了对您有帮助,如果有更好的内容,也可以分享给我。