一、Maven简介
1. 什么是Maven
Maven:是Apache提供的免费开源的项目管理工具。它提供了一个项目对象模型(pom.xml)、一个依赖管理系统(根据坐标,帮我们引入依赖)、一套项目生命周期(帮我们方便的进行项目构建)、一组标准集合(Maven工程的目录结构规范,坐标规范)、和一个插件管理系统(提供了进行项目构建的命令)。
2. Maven的作用
项目构建:一个项目开发之后,经历的编译、测试、打包、安装、部署等等一系列的过程,叫项目构建 主要是测试、运维/实施人员使用的 依赖管理:Maven可以帮我们管理jar包,可以轻松的解决依赖的冲突问题 依赖:通常指jar包,不仅仅是jar包 模块化创建项目
3. 坐标的概念
坐标:被Maven管理的每个项目,都必须有自己的唯一标识,这个唯一标识叫坐标坐 标的组成:由三部分组成 groupId:公司名、组织名 域名倒写。比如: c3p0 , com.jd artifactId:项目名、包名。比如: c3p0 version:版本号。比如: 0.9.1.2 , 1.0-SNAPSHOT , 5.2.0-RELEASE
小结
什么是Maven:是Apache提供的一个开源免费的项目管理工具 Maven的作用: 项目构建:编译、测试、打包、安装、部署等等一系列的过程,叫项目构建 依赖管理:帮我们管理jar包依赖 模块化创建项目 坐标的概念: 被Maven管理的每个项目/jar包,其唯一标识叫坐标 由三部分组成: groupId:企业名/组织名 域名倒写 artifactId:包名/项目名 version:版本号
二、Maven安装配置【操作】
1. Maven的仓库类型
1.本地仓库:本地缓存jar包的文件夹
本地仓库默认在:C:\Users\电脑的用户名\.m2\repository 通常会修改配置文件,修改本地仓库的路径2.远程仓库(私服):一些企业、组织、社区搭建的仓库服务
通常企业里人自己搭建私服。私服里的jar包大多数还是来自于中央仓库 有些是企业内部自己搭建、自己使用的 有些是企业搭建面向整个互联网的,比如:阿里私服3.中央仓库
是Maven官方团队维护的仓库,里边有最全的jar包。 但是没有授权的jar包,中央仓库里没有,比如:Oracle驱动包 地址:https://repo1.maven.org/maven2
2. 下载与目录结构
下载地址:http://maven.apache.org Maven的目录结构:
1 2 3 4 5 |
maven |--bin Maven的可执行命令文件夹 |--boot Maven的引导程序(类加载器) |--conf 配置文件夹 |--lib Maven的核心程序代码 |
3. Maven安装配置
3.1 安装Maven
1.Maven是免安装的,直接解压
注意:解压路径里,不要有中文、空格、特殊字符2.注意检查JDK环境变量是否正确
Maven软件是Java语言编写的3.配置Maven环境变量:
增加MAVEN_HOME=Maven的解压目录 修改Path中添加 %MAVEN_HOME%\bin
1.验证Maven配置
打开cmd,输入命令:mvn -version
3.2 配置Maven仓库
配置步骤:
新建一个目录,例如 :repository,目录里不能有中文、空格、特殊字符 比如我的路径为:D:\develop_software\maven\repository 修改Maven的conf\settings.xml配置文件
扩展:
修改settings.xml里,设置Maven编译的版本jdk1.8。在<profiles>里边增加:
1 2 3 4 5 6 7 8 9 10 11 12 |
< 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 > |
小结
仓库类型
本地仓库:自己电脑上缓存jar包的文件夹 远程仓库(私服):一些企业、社区、组织自己搭建的仓库服务 中央仓库:Maven官方团队维护仓库服务maven的安装:
解压。注意:解压的目录里不要有中文、空格、特殊字符 配置环境变量: 新增MAVEN_HOME, 值就是maven软件的解压目录 修改Path,值里新增%MAVEN_HOME%\bin配置本地仓库:
创建repository目录里不要有中文、空格 、特殊字符 修改Maven的conf\settings.xml,增加本地仓库的配置:<localRepository>标签
三、Maven项目的目录结构
一个项目要想使用Maven进行管理,那么这个项目的目录结构就必须要符合Maven的要求:
1 2 3 4 5 6 7 8 9 10 11 12 |
maven项目 |--pom.xml 项目对象模型文件,一个Maven项目必定有pom.xml文件 |--src |--main 项目的主体程序代码目录 | |--java 项目的Java程序代码放在这文件夹里 | |--resources 项目的配置文件放在这里 | |--webapp 项目的web资源放在这里,html,css,js,jsp,音频,图片,视频等等 | |--WEB-INF | |--其它web资源 |--test 项目的单元测试代码目录 |--java 项目的单元测试代码 |--resources 项目单元测试需要的配置文件 |
小结
src\main\java :放主体程序代码的java文件
src\main\resources :放主体程序代码的配置文件
src\main\webapp :放主体程序代码的web资源:html、css、js、jsp等等
四、Maven构建项目
1. 项目构建的生命周期
Maven命令执行的规律:
1 2 3 4 5 6 |
clean: clean compile: compile test: compile=>test package: compile=>test=>package install: compile=>test=>package=>install 人的生命周期:婴儿=>儿童=>少年=>青年=>中年=>老年 |
Maven有三套生命周期
清理生命周期:CleanLifeCycle 有常用命令: clean 默认生命周期(构建生命周期):DefaultLifeCycle 有常用命令: compile->test->package->install->deploy 站点生命周期:SiteLifeCycle 有常用命令: site 。生成Maven项目的描述信息文档 如果执行了一个目标命令:Maven会把生命周期里的命令,从第一个一直执行到目标命令为止小结
常用命令:
mvn clean :清理。删除掉target目录 mvn compile :编译。把主体程序代码进行编译,放到target目录里 mvn test :测试。编译并执行单元测试代码 mvn package :打包。Java项目打成jar包,web项目打包war包 mvn install :安装。把程序包安装到本地仓库,安装位置是坐标对应的文件夹Maven的生命周期
清理生命周期CleanLifeCycle: clean 默认生命周期/构建生命周期DefaultLifeCycle: compile=>test=>package=>install=>deploy 站点生命周期SiteLifeCycle: site 生命周期的作用:只要执行一个目标命令,Maven会从生命周期里第一个阶段开始,执行到目标命令为止
五、Maven管理依赖和插件
Maven的依赖管理
把Maven配置到idea中 在idea里创建Maven的java项目 在idea里创建Maven的web项目 Maven项目中,引入依赖的方法 Maven的依赖范围配置,解决jar包冲突1. 在idea配置Maven(操作) 配置Maven
增加运行的配置项:- DarchetypeCatalog=internal
2. 在idea创建Maven项目
2.1 创建Maven的java项目
1.创建Module,选择Maven类型,选择骨架 org.apache.maven.archetypes:maven-archetype-quickstart
2.设置项目的坐标
3.再继续步骤,跟以前的一样:设置module的名称和位置
注意:不要和已有的其它module重名或者重位置
4.创建后,如果弹窗 Maven projects need to be imported ,就选择 启动自动导入。
作用是:如果pom.xml文件有变更,Maven会自动读取,立即生效;否则就要手动导入
5.如果文件夹缺失,就创建补全,然后刷新
2.2 创建Maven的web项目
1.选择项目的骨架
2.设置项目的坐标
如果上边 Add as module to 和 Parent 是有配置的,那么要在右边全部选择none
3. 引入依赖
如果项目中需要使用jar包,只需要把jar包的坐标配置到项目的pom.xml中即可。在pom.xml的 <dependencies> 标签里增加以下内容:
1 2 3 4 5 6 |
< dependency > < groupId >junit</ groupId > < artifactId >junit</ artifactId > < version >4.12</ version > < scope >依赖范围</ scope > </ dependency > |
可以在pom.xml里,输入 dep ,会自动补充坐标模板,我们填充坐标值即可
可以使用 alt+insert ,会弹出依赖导入的界面,可以从本地仓库里搜索依赖
如果不知道依赖的坐标,可以从中央仓库搜索坐标:https://mvnrepository.com/
4. 依赖范围
如果项目中引入的jar包过多,可能会出现jar包冲突,我们可能设置jar包不同的依赖范围来处理jar包冲突。
Maven的依赖范围有:
compile :默认的依赖范围,全范围有效。 test :单元测试有效。src/test里有效,src/main里无效 provided :编译时有效,运行时使用其它地方提供的jar包。 runtime :运行时有效,编译时无效。比如:数据库驱动包 system :引入仓库之外的本地jar包。少用
实际开发中特殊的jar包
Junit :依赖范围通常设置为 test servlet-api, jsp-api :依赖范围通常设置为 provided 数据库驱动包 :依赖范围可以是默认的,也可以是 runtime 其它包,绝大多数都是默认依赖范围c ompile小结
依赖范围:
compile:默认的。编译时有效,运行时有效,单元测试有效 test:单元测试有效(src\main\test)里有效 单元测试Junit的包 provided:编译时有效,运行时无效(备胎包) servlet-api,jsp-api runtime:编译时无效,运行时有效 数据库驱动包 system:引用仓库之外的本地jar包,少用
Maven的插件
maven插件可以完成一些特定的功能。例如,集成jdk插件可以方便的修改项目的编译环境;集成tomcat插件后,无需安装tomcat服务器就可以运行tomcat进行项目的发布与测试。 在pom.xml的 plugins 标签中,通过 plugin 标签引入maven的功能插件。jdk编译版本插件 把 <plugins> 标签,放在pom.xml的 <build> 标签内部
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<!--jdk编译插件--> < plugins > < plugin > < groupId >org.apache.maven.plugins</ groupId > < artifactId >maven-compiler-plugin</ artifactId > < version >3.2</ version > < configuration > < source >1.8</ source > < target >1.8</ target > < encoding >utf-8</ encoding > </ configuration > </ plugin > </ plugins > |
tomcat7插件 把 <plugins> 标签,放在pom.xml的 <build> 标签内部
1 2 3 4 5 6 7 8 9 10 11 12 |
< plugins > < plugin > < groupId >org.apache.tomcat.maven</ groupId > < artifactId >tomcat7-maven-plugin</ artifactId > < configuration > <!-- 指定端口 --> < port >82</ port > <!-- 项目路径 --> < path >/</ path > </ configuration > </ plugin > </ plugins > |
六、Maven的私服
搭建私服
了解私服的概念 搭建私服
讲解
什么是Maven的私服 公司在自己的局域网内搭建自己的远程仓库服务器,称为私服 私服服务器即是公司内部的 maven 远程仓库, 每个员工的电脑上安装 maven 软件并且连接私服服务器,员工将自己开发的项目打成 jar 并发布到私服服务器,其它项目组从私服服务器下载所依赖的构件(jar)。 私服还充当一个代理服务器,当私服上没有 jar 包会从互联网中央仓库自动下载,如下图 :
搭建Maven私服
1. 下载nexus Nexus 是 Maven 仓库管理器, 通过 nexus 可以搭建 maven 仓库,同时 nexus 还提供强大的仓库管理功能,构件搜索功能等。 下载地址: http://www.sonatype.org/nexus/archived/ ,下载: nexus-2.12.0-01-bundle.zip
2. 安装nexus
1.解压nexus-2.12.0-01-bundle.zip。注意:解压路径里不要有中文、空格、特殊字符
2.以管理员方式打开cmd,切换进入解压目录的bin文件夹里,运行命令:nexus.bat install
把nexus安装成为Windows的服务
3. 启动nexus 启动nexus服务:以管理员方式打开cmd,输入命令:net start nexus(第一次启动比较慢) 如果把nexus服务设置为开机自启动,以后就不需要再手动启动nexus服务了 但是通常是nexus服务器上设置。我们自己电脑上,没有必要设置开机自启动 关闭nexus服务:以管理员方式打开cmd,输入命令:net stop nexus
4. 登录nexus
打开浏览器,输入地址: http://localhost:8081/nexus
可以打开nexus的 conf/nexus.properties 文件,修改端口号,重启nexus服务后生效
登录[Log in],输入帐号和密码进行登录(帐号admin,密码admin123)
nexus的仓库类型介绍
hosted :宿主仓库, 部署自己的 jar 到这个类型的仓库,包括 releases 和 snapshot 两部分, Releases 公司内部发布版本仓库、 Snapshots 公司内部测试版本仓库 proxy :代理仓库, 用于代理远程的公共仓库,如 maven 中央仓库,用户连接私服,私服自动去中央仓库下载 jar 包或者插件。 group :仓库组,用来合并多个 hosted/proxy 仓库,通常我们配置自己的 maven 连接仓库组。 virtual :虚拟仓库,兼容 Maven1 版本的 jar 或者插件
小结
hosted:宿主仓库。nexus私服本身的仓库 proxy:代理仓库。私服所代理的仓库 group:仓库组。针对于使用者,只要配置一个仓库组的地址,就可以引用组里定义的所有子库 virtual:虚拟仓库
使用私服
把项目发布到私服 从私服下载jar包把项目发布到私服
使用场景
企业中多个团队协作开发通常会将一些公用的组件、开发模块等发布到私服供其它团队或模块开发人员使用。 本例子假设多团队分别开发。某个团队开发完在common_utils, 将 common_utils发布到私服供其它团队使用配置
第一步:在用户自己的Maven软件里修改 conf/settings.xml :
在 servers 标签里,配置私服的帐号和密码
1 2 3 4 5 6 7 8 9 10 |
< server > < id >releases</ id > < username >admin</ username > < password >admin123</ password > </ server > < server > < id >snapshots</ id > < username >admin</ username > < password >admin123</ password > </ server > |
第二步:在用户需要发布的私服的项目pom.xml里,配置私服仓库的地址。
本公司的自己的 jar 包会上传到私服的宿主仓库,根据工程的版本号决定上传到哪个宿主仓库 如果版本为 release 则上传到私服的 release 仓库,如果版本为snapshot 则上传到私服的 snapshot 仓库 把以下内容写到项目的pom.xml的根标签里
1 2 3 4 5 6 7 8 9 10 11 12 |
< distributionManagement > < repository > <!-- 注意:id的值,是刚刚在settings.xml中配置的server的id --> < id >releases</ id > < url >http://localhost:8081/nexus/content/repositories/releases/</ url > </ repository > < snapshotRepository > <!-- 注意:id的值,是刚刚在settings.xml中配置的server的id --> < id >snapshots</ id > < url >http://localhost:8081/nexus/content/repositories/snapshots/</ url > </ snapshotRepository > </ distributionManagement > |
测试
1.启动nexus服务(如果已启动,就不需要做这一步)
2.在项目里执行Maven的deploy命令:
根据本项目pom.xml中version定义决定发布到哪个仓库 如果version定义为xx-snapshot,项目将发布到 nexus 的 snapshot仓库 如果version定义为xx-release,项目将发布到 nexus的 release 仓库从私服下载jar包
使用场景
没有配置 nexus的时候,如果本地仓库没有,就会去中央仓库下载,下载速度不稳定 通常在企业中会在局域网内部署一台私服服务器。这样: 本地项目首先去本地仓库找 jar; 如果没有找到则连接私服从私服下载 jar 包; 如果私服没有 jar 包,私服同时作为代理服务器从中央仓库下载 jar 包好处是:
由私服对公司项目的依赖 jar 包统一管理 可以提高下载速度, 项目连接私服下载 jar 包的速度,要比项目连接中央仓库的速度快的多。配置
第一步:在 settings.xml 的 profiles 标签下配置:
注:由于 settings.xml 中没有 repositories 标签,所以要使用 profile 标签来配置仓库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
< profile > <!--profile 的 id--> < id >dev</ id > < repositories > < repository > <!--仓库 id, repositories 可以配置多个仓库,保证 id 不重复--> < id >nexus</ id > <!--仓库地址,即 nexus 仓库组的地址--> < url >http://localhost:8081/nexus/content/groups/public/</ url > <!--是否下载 releases 构件--> < releases > < enabled >true</ enabled > </ releases > <!--是否下载 snapshots 构件--> < snapshots > < enabled >true</ enabled > </ snapshots > </ repository > </ repositories > < pluginRepositories > <!-- 插件仓库, maven 的运行依赖插件,也需要从私服下载插件 --> < pluginRepository > <!-- 插件仓库的 id 不允许重复,如果重复后边配置会覆盖前边 --> < id >public</ id > < name >Public Repositories</ name > < url >http://localhost:8081/nexus/content/groups/public/</ url > </ pluginRepository > </ pluginRepositories > </ profile > |
第二步:激活 profile 定义的仓库
激活后,配置的仓库才会生效
1 2 3 |
< activeProfiles > < activeProfile >dev</ activeProfile > </ activeProfiles > |
测试 创建Maven应用 testdownload ,配置依赖
1 2 3 4 5 |
< dependency > < groupId >com.baidu</ groupId > < artifactId >commons-utils</ artifactId > < version >1.0-SNAPSHOT</ version > </ dependency > |
编译项目,查看日志会出现:
查看本地仓库里,会有从私服下载的jar包
小结
把项目发布到私服:
在Maven的settings.xml里,配置仓库的帐号和密码 在Maven项目的pom.xml里,配置仓库的地址 执行Maven命令:mvn deploy从私服里下载jar:
在settings.xml里配置仓库地址 在settings.xml里激活仓库的配置 在Maven项目里,配置依赖 如果这个依赖,在本地仓库里没有,Maven就会从私服里下载到本地仓库,再引入到Maven项目里
上传jar到本地仓库和私服
目标 把第三方jar打包到本地仓库 把jar打包发布到私服
把第三方jar打包到本地仓库 如果有一个jar不在本地仓库、不在私服、不在中央仓库。我们可以把jar安装到本地仓库中,方便后续使用 cmd 命令示例:
mvn install:install-file -DgroupId = com.alibaba -DartifactId = fastjson -Dversion = 1.1 .37 -Dfile = fastjson-1.1.37.jar -Dpackaging = jar
查看本地仓库,验证是否安装成功
把第三方jar打包发布到私服 第一步:在 settings.xml 中配置私服的server信息
1 2 3 4 5 |
< server > < id >thirdparty</ id > < username >admin</ username > < password >admin123</ password > </ server > |
第二步:执行命令
mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dpackaging=jar -Dfile=fastjson-1.1.37.jar -Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty
第三步:查看私服的第三方仓库,验证是否发布成功
参数说明 DgroupId 和 DartifactId 构成了 jar 包的坐标,项目就是依靠这两个属性定位。可以自己起名 Dfile 表示需要上传的 jar 包的位置。 Durl 私服上仓库的位置,打开 nexus——>repositories 菜单,可以看到该路径。 DrepositoryId 服务器的表示 id,在 nexus 的 configuration 可以看到。 Dversion 表示版本信息。
上传成功后,在 nexus 界面点击 3rd party 仓库可以看到这包。
七、Lombok
1. Lombok介绍与配置
什么是Lombok Lombok的作用 Lombok的配置什么是Lombok Lombok是一个Java库,能自动插入编辑器并构建工具,简化Java开发。 官网: https://www.projectlombok.org/
Lombok的作用
通过添加注解的方式,帮我们生成一些方法,提高开发人员的开发效率。
例如:
开发中经常需要写的javabean,要添加相应的getter/setter,也许还要去写构造器、equals等方法 当属性多时,会出现大量的getter/setter方法,这些显得很冗长也没有太多技术含量 使用Lombok,可以帮我们生成这些方法,我们就不用自己编写了Lombok的配置 添加maven依赖
1 2 3 4 5 6 |
< dependency > < groupId >org.projectlombok</ groupId > < artifactId >lombok</ artifactId > < version >1.18.8</ version > < scope >provided</ scope > </ dependency > |
安装插件
注意:Lombok插件暂不支持idea2020 使用Lombok还需要插件的配合。 打开idea的设置,点击Plugins,点击Browse repositories,在弹出的窗口中搜索lombok,然后安装即可解决编译时出错问题
编译时出错,可能是没有enable注解处理器。Annotation Processors > Enable annotation processing。设置完成之后程序正常运行。
2. Lombok的常用注解
目标
@Data
@Getter/@Setter
@ToString
@NoArgsConstructor, @AllArgsConstructor
@Data
@Data注解在类上,会为类的所有属性自动生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
1 2 3 4 5 6 7 8 9 10 11 |
@Data public class User implements Serializable{ private Integer id; private String username; private String password; private String address; private String nickname; private String gender; private String email; private String status; } |
@Getter/@Setter
如果觉得@Data不够精细,可以使用@Getter/@Setter注解 此注解用在属性上,可以为相应的属性自动生成Getter/Setter方法.
1 2 3 4 5 6 7 8 9 10 11 12 |
public class User implements Serializable{ @Setter @Getter private Integer id; private String username; private String password; private String address; private String nickname; private String gender; private String email; private String status; } |
@ToString
类上使用@ToString注解,Lombok会生成一个 toString() 方法 生成的 toString 方法会输出类名、所有属性(会按照属性定义顺序),用逗号来分割。 通过 exclude 属性指定忽略字段不输出,
1 2 3 4 5 6 7 8 9 10 11 |
@ToString (exclude = { "id" }) public class User implements Serializable{ private Integer id; private String username; private String password; private String address; private String nickname; private String gender; private String email; private String status; } |
@xxxConstructor
@NoArgsConstructor: 无参构造器
1 2 3 4 5 6 7 8 9 10 11 |
@NoArgsConstructor public class User implements Serializable{ private Integer id; private String username; private String password; private String address; private String nickname; private String gender; private String email; private String status; } |
@AllArgsConstructor : 全参构造器
1 2 3 4 5 6 7 8 9 10 11 |
@AllArgsConstructor public class User implements Serializable{ private Integer id; private String username; private String password; private String address; private String nickname; private String gender; private String email; private String status; } |
附:添加依赖出错怎么办
现象:
在pom.xml里添加依赖坐标后,报红,引入依赖失败
原因:
可能有多方面因素导致,最常见的原因是: 网络不稳定,导致从中央仓库中下载依赖时失败 本地仓库中有大量的 *.lastUpdated 文件,是下载依赖出错后遗留的不完整数据解决:
第一步:配置阿里云的仓库镜像
打开Maven软件里conf/settings.xml
在 <mirrors> 标签中添加如下内容:
1 2 3 4 5 6 |
< mirror > < id >alimaven</ id > < name >aliyun maven</ name > < url >http://maven.aliyun.com/nexus/content/groups/public/</ url > < mirrorOf >central</ mirrorOf > </ mirror > |
第二步:删除本地仓库里的缓存文件
以 .lastUpdated 结尾的文件,是下载依赖失败后遗留的文件,需要清除掉1.在本地仓库文件夹里搜索 *.lastUpdated
2.把搜索到的所有文件全部删除
第三步:重新添加依赖
在 pom.xml 中,删除原有的所有依赖 重新添加依赖进去。 Maven会自动重新导入依赖,如果本地仓库中没有,就会自动从阿里云仓库镜像下载依赖
总结
本篇文章就到这里了,希望可以帮到你,也希望您能多多关注的更多内容!
原文链接:https://blog.csdn.net/jiayou516/article/details/117913348
查看更多关于Maven学习----Maven安装与环境变量配置教程的详细内容...