Maven项目详解

maven的概念模型

Maven是Apache下的一个开源项目,它是一个项目管理工具,它用于对java项目进行项目构建、依赖管理及项目信息管理。当前使用Maven的项目在持续增长。
Maven包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

在这里插入图片描述
1.Pom项目对象模型
创建一个maven项目,每一个maven项目中都有一个pom.xml文件,在这个文件中我们就可以配置相关信息
2.依赖管理
通过定义项目所依赖组件的坐标由maven进行依赖管理。
比如:项目依赖struts2.3.24,通过在pom.xml中定义依赖即可将struts2的jar包自动加入工程:
3.maven项目生命周期
在这里插入图片描述

Maven仓库

关于仓库的种类:
1.本地仓库
由我们自己配置的一个仓库,从远程仓库中下载下的jar,都会存储到本地仓库中。
2.远程仓库
 网络上的其它仓库
3.中央仓库:
在maven环境内部内置一个远程仓库地址http://repo1.maven.org/maven2 ,它是中央仓库,服务于整个互联网,它是由Maven自己维护,里面有大量的常用类库,并包含了世界上大部分流行的开源项目构件。它本身也是一个远程仓库,因为它是由maven团队维护

Maven安装配置

下载网址: http://maven.apache.org/download.cgi
在这里插入图片描述
本教程使用3.1.1 版本
在这里插入图片描述
解压不含有中文和空格的目录
在这里插入图片描述

bin目录 mvn.bat (以run方式运行项目)、 mvnDebug.bat(以debug方式运行项目 )
boot目录 maven运行需要类加载器 
conf目录 settings.xml 整个maven工具核心配置文件 
lib目录 maven运行依赖jar包

环境变量配置

电脑上 安装JDK1.4 + 版本  (将JAVA_HOME/bin 配置环境变量path )
1.在环境变量中创建一个MAVEN_HOME配置的是D:\apache-maven-3.3.9
2.在环境变量中path配置  %MAVEN_HOME%\bin

在这里插入图片描述
将 %MAVEN_HOME%\bin 加入环境变量 path
在这里插入图片描述
通过 mvn -v命令检查 配置是否成功
在这里插入图片描述

Maven仓库配置(本地仓库)

本地仓库是用来存放联网下载maven的插件和jar包,maven本地仓库有的jar不再从互联网下载,所以本地仓库相当于一个缓存。
本地仓库有一个默认位置:${user.dir}/.m2/repository,${user.dir}表示windows用户目录,如下

在这里插入图片描述

全局本地仓库:
	我们在maven目录下的conf下的setttings.xml文件中配置的就是一个全局的本地仓库
局部本地仓库:
	可以将settings.xml文件复制到指定的目录下,来进行配置,它就是一个局部的。

注意:如何在settings.xml文件中指定仓库位置:
在这里插入图片描述

Eclipse整合maven

当前的eclipse的版本是Mars.2 Release (4.5.2),此版本自带maven插件不用单独安装。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
指定settings.xml文件
在这里插入图片描述
在这里插入图片描述
注意:如果修改了 setting.xml点击上图片的“update settings”,对本地仓库重建索引,点击“Reindex”。指定它,会帮助我们重建索引。
当我们重建索引后,后续在pom.xml文件中引入依赖,就会为我们添加提示。
在eclipse中浏览仓库
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Maven命令介绍

这些命令都是通过插件方式来使用的。
执行编译命令compile,在eclipse中可以省略mvn,cmd下要加上mvn compile
在这里插入图片描述
编译后 .class文件在 target/classes 下 (这个命令只会对java源程序编译, 不会编译测试代码 , 编译测试类 mvn test-compile , 编译后.class 文件在 target\test-classes )
在这里插入图片描述
执行清空命令clean,清空target下的编译好的文件包括打好的包。
Mvn test命令,编译test包下的文件到target目录。
Package命令,将项目打包到target下,默认生成jar包名称 : artifactId-version.jar java项目生成 jar包, web项目生成war包
在这里插入图片描述
在这里插入图片描述
Install命令:将项目jar或war打包发布到仓库---- 安装到仓库/groupId/artifactId/version 目录
测试命令 mvn test 执行所有测试用例方法, 重新编译

在实际开发中,一般都是在eclipse中来执行maven的命令,我们也可以在命令行执行。
Run as 采用 mvn 命令运行 ,Debug as 采用 mvnDebug 命令调试方式运行(可打断点)
在这里插入图片描述
如:maven clean maven install maven test可以直接执行
在这里插入图片描述

maven命令在命令行下执行

Mvn命令在命令行执行,前提必须定位到pom.xml文件所在的路径下执行需要加mvn,eclipse中不需要加。

maven项目生命周期

在这里插入图片描述
Maven clean maven compile maven test……

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

执行后边的生命周期命令,前边的会自动执行,比如执行package 上面的命令都会自动执行。
在这里插入图片描述
1、生命周期clean
clean生命周期每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。有Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:
pre-clean 执行一些需要在clean之前完成的工作
clean 移除所有上一次构建生成的文件
post-clean 执行一些需要在clean之后立刻完成的工作
mvn clean 中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,mvn clean 等同于 mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。这是Maven很重要的一个规则,可以大大简化命令行的输入。

2、生命周期default
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     将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

3、生命周期site
Site生命周期pre-site 执行一些需要在生成站点文档之前完成的工作
site 生成项目的站点文档
post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy 将生成的站点文档部署到特定的服务器上
这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。

Pom.xml配置文件详解

pom.xml是Maven项目的核心配置文件,位于每个工程的根目录,基本配置如下:
<project > :文件的根节点 .
<modelversion > : pom.xml使用的对象模型版本(可以理解为约束的版本) .
<groupId > :项目名称,一般写项目的域名
<artifactId > :模块名称,子项目名或模块名称
<version > :产品的版本号 . 
<packaging > :打包类型,一般有jar、war、pom 等 
<name > :项目的显示名,常用于 Maven 生成的文档。  
<description > :项目描述,常用于 Maven 生成的文档
<dependencies> :项目依赖构件配置,配置项目依赖构件的坐标
<build> :项目构建配置,配置编译、运行插件等。

第一部分: POM Relationships 关系 
	Coordinates 坐标: 在仓库中唯一标识项目位置三个参数 
	<groupId> 项目名称
	<artifactId> 模块名称
	<version> 版本号
		
	Aggregation 聚合(多模块) : 将项目分解为多个不同模块 
	Inheritance 继承 : 项目之间继承,实现POM复用 
	Dependencies 依赖: 项目依赖另一个项目进行编译或者运行 
第二部分: Project Information 项目信息 
	name :项目名称 
	desciption: 项目描述
第三部分: Build settings  构建配置
	properties : 配置属性 
	build :构建项目需要插件配置 
	packaging :打包方式 jar、war、pom (使用继承)
	reporting : 报表
第四部分: Build Environment 构建环境 (在依赖、构建、运行 生效配置 )
	Distribution Management :版本锁定 
	Profile : 灵活自定义配置,在特定情况激活 

工程默认编码
在这里插入图片描述
关于maven的tomcat插件使用
可以手动配置端口:maven tomcat插件配置端口
在这里插入图片描述
如果使用的tomcat7,可以按如下方案:

<plugin>
	<groupId>org.apache.tomcat.maven</groupId>
	<artifactId>tomcat7-maven-plugin</artifactId>
	<version>2.2</version>			
</plugin>
在eclipse中运行,使用 tomcat7:run就可以

在这里插入图片描述
如果使用的是tomcat6,可以按如下方案:

<plugin>
	<groupId>org.codehaus.mojo</groupId>
	<artifactId>tomcat-maven-plugin</artifactId>
	<version>1.1</version>
</plugin>
运行:tomcat:run

可以同时添加俩个tomcat插件(7\6)
finalname:配置生成的war文件名称maven_ssh
在这里插入图片描述
添加依赖
在pom.xml中定义dependency标签,导入依赖
在这里插入图片描述
在这里插入图片描述
通过eclipse导入:
在这里插入图片描述
在这里插入图片描述

查找坐标

方法一:使用网站搜索
http://search.maven.org/
http://mvnrepository.com/
网站搜索示例:
在这里插入图片描述
在这里插入图片描述
方法二:使用maven插件的索引功能
在这里插入图片描述

依赖范围scope

所谓的依赖范围,是指我们导入的jar包它的生命周期,简单说,就是它在什么情况下可有效
默认:compile
compile:编译范围,指A在编译时依赖B,此范围为默认依赖范围。编译范围的依赖会用在编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。
provided:provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用, provided依赖在编译和测试时需要,在运行时不需要,比如:servlet api被tomcat容器提供。
runtime:runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如:jdbc的驱动包。由于运行时需要所以runtime范围的依赖会被打包。
test:test范围依赖 在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用,比如:junit。由于运行时不需要所以test范围依赖不会被打包。
system:system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径,需要指定systemPath磁盘路径,system依赖不推荐使用。

import:2020新增
通过scope的import在本项目以及子项目中,可以继承spring-cloud-dependencies工程中的依赖和版本就是一些组件。
  <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-dependencies</artifactId>
     <version>${spring-cloud.version}</version>
     <type>pom</type>
     <scope>import</scope>
  </dependency>
 不这么写只能继承下图spring-boot-starter-parent这个的,但是加了可以依赖到spring-cloud很多组件。

在这里插入图片描述

在这里插入图片描述

测试总结:
默认引入 的jar包 ------- compile 【默认范围 可以不写】(编译、测试、运行 都有效 )
servlet-api 、jsp-api ------- provided (编译、测试 有效, 运行时无效 防止和tomcat下jar冲突)
jdbc驱动jar包 ---- runtime (测试、运行 有效 )
junit ----- test (测试有效)
依赖范围由强到弱的顺序是:compile>provided>runtime>test

依赖传递

A 依赖B、B依赖C,在A中导入B后会自动导入C,C是A的传递依赖,如果C依赖D则D也是A的传递依赖。为什么会出现这种情况,原因在依赖的jar包对应的pom文件中还有依赖的声明。

依赖传递范围

简单说,通过依赖传递的范围就可以解决是否要导入依赖的jar包。
纵列:项目A依赖于B的范围。
横列:项目B依赖于C的范围。
框中结果即得出A依赖于C的范围。
在这里插入图片描述

依赖版本冲突问题解决

<!-- struts2-spring-plugin依赖spirng-beans-3.0.5 -->
  	<dependency>
  		<groupId>org.apache.struts</groupId>
  		<artifactId>struts2-spring-plugin</artifactId>
  		<version>2.3.24</version>
  	</dependency>
  	
<!-- spring-context依赖spring-beans-4.2.4 -->
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-context</artifactId>
  		<version>4.2.4.RELEASE</version>
  	</dependency>
org.apache.struts依赖spirng-beans-3.0.5,spring-context依赖spring-beans-4.2.4,但是发现spirng-beans-3.0.5加入到工程中,而我们希望spring-beans-4.2.4加入工程。
maven自动按照下边的原则调解依赖标准:
	1.第一声明者优先原则
		在pom文件中谁先声明以谁为准。
	2.路径近者优先原则
		例如:A-> spirng-beans-4.2.4,A->B-> spirng-beans-3.0.5,则spirng-beans-4.2.4优先

解决方案:
1、排除依赖(开发中应用比较少)
在这里插入图片描述
2、锁定版本(推荐使用)
面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版本的方法确定依赖构件的版本,此方法在企业开发中常用:
在这里插入图片描述
Pom中查看标签位置规则
在project上点击f2
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值