1、为什么使用Maven

普通项目使用Maven工具
一个项目就是一个工程,当项目很庞大时,完全用package去划分,显得过于复杂Maven可以把一个大的项目拆分成多个工程,分工协作,且相互之间能互相访问
不同的工程中,存储着许多相同的jar包。浪费存储,且项目臃肿Maven可以将jar包保存在“仓库”中,工程只需要引用即可,不需要在工程中存储
需要自己去寻找jar包,有些官网甚至只支持maven下载。所有知名框架及第三方工具jar包都已经按照规范放入了Maven的中央仓库,使用Maven下载安全,便捷
需要花时间了解jar包之间的依赖关系。然后去下载依赖的jar包借助Maven,自动分析jar包的依赖关系,并自动添加到项目中来

2、Maven的基本概念

  • Maven:自动化构建工具,以“java源代码”,“配置文件”,“HTML”,“图片”等资源为“原材料”,去“构建”一个可以运行的项目。
  • Maven本地仓库:存放了Maven构建时使用的插件,第三方框架和工具类jar包,Maven工程。
  • Maven工程与打包类型:创建Maven工程时,选择打包类型决定了创建的工程类型。
工程类型打包类型
父工程pom
java工程jar
web工程war

3、Maven安装

  • 安装jdk
  • 下载Maven核心程序压缩包
  • 解压maven核心程序到无中文和空格的路径下

  • 配置Maven的环境变量

新建用户变量“M2_HOME”或者“MAVEN_HOME”,赋值为“E:\apache-maven-3.2.2”

新建用户变量“path”赋值为 “E:\apache-maven-3.2.2\bin”

  • 检验安装结果

dos命令窗口下输入命令, “mvn -v”,回车后显示Maven版本等信息即安装成功

4、Maven本地仓库配置

下载本地仓库压缩包并解压到无中文和空格的路径下:

本地仓库的默认路径:【系统当前登录用户的家目录】\.m2\repository

修改本地仓库的默认路径:找到Maven核心程序的 conf\settings.xml 配置文件,把其中的 localRepository 配置从注释中拿出来,并修改本地仓库路径。

5、Maven核心概念

  • 约定的目录结构
  • POM
  • 坐标
  • 依赖管理
  • 仓库管理
  • 生命周期
  • 插件和目标
  • 继承
  • 聚合

5.01、约定的目录结构

Maven对工程有自己约定好的目录结构,每个目录都有自己的含义。

5.02、常用的Maven命令

注意事项: 在命令窗口执行与构建过程相关的Maven命令,必须进入pom.xml所在的目录。

执行命令后,核心程序会从本地仓库寻找命令对应的插件,如果找不到,则会自动去网上下载资源到本地仓库。然后通过插件去执行真正的操作。

mvn clean清理清理项目的target目录
mvn compile编译主程序编译主程序(会在项目路径下生成一个target目录,并把编译的class等文件放进来)
mvn test-compile编译测试程序编译测试程序
mvn test执行测试编译项目后,再执行Junit测试方法
mvn package打包编译项目后,再执行Junit测试方法,再把项目打包到target目录(打成jar包)
mvn install安装编译项目后,再执行Junit测试方法,再把项目打包到target目录,再安装到本地仓库。
mvn deploy部署编译项目后,再执行Junit测试方法,再把项目打包到target目录,再安装到本地仓库和远程maven私服仓库

5.03、POM

Project Object Model 项目对象模型

pom.xml 对于Maven工程是核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置

5.04、坐标

  • pom.xml里,使用下面三个向量,在仓库中唯一定位一个Maven工程
groupId公司或者组织的域名倒序+项目名<groupId>com.dfr.TestMaven</groupId>
artifactId模块名<artifactId>Hello</artifactId>
version版本<version>0.0.1-SNAPSHOT</version>
  • 坐标与仓库路径的对应关系

groupId + "/" + artifactId + "/" +  version + "/" + artifactId +  "-" + version + ".jar"  

然后把groupId中的“.”  替换为 “/”,结果如下:

com/dfr/TestMaven/Hello/0.0.1-SNAPSHOT/Hello-0.0.1-SNAPSHOT.jar

5.05、仓库管理

  • 本地仓库:当前电脑上部署的 仓库目录
  • 私服:架设在局域网环境中,为局域网范围内 的所有Maven工程服务
  • 中央仓库:架设在Internet上,为全世界的Maven工程服务
  • 中央仓库镜像:架设在各大洲,为了分担中央仓库的流量,更快响应用户

仓库中保存的内容:Maven自身需要的插件,第三方框架或者工具jar包,自己开发的Maven工程。

5.06、依赖管理

pom.xml中有如下依赖关系的配置, Maven解析依赖信息会到本地仓库中查找被依赖的jar包。

<dependencies>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.0</version>
		<scope>test</scope>
	</dependency>
</dependencies>

5.07、依赖的范围

 主程序是否需要测试程序是否需要是否参与打包备注
<scope>compile</scope>

编译依赖的jar包,主程序和测试程序都可以使用。

<scope>test</scope>测试程序并不需要打包,所以其依赖包也不需要打包
<scope>provided</scope>例如Servlet的jar包,开发和测试都需要,但是真正部署时,Servlet容器自己会提供。并不需要打包。

5.08、生命周期

  • 生命周期定义:一套生命周期,就是把许多的构建过程,有序的排列。形成一套有序的构建过程集合。
  • 生命周期特性:无论执行该生命周期的哪个阶段,它前面的所有阶段都会被按顺序执行
  • Maven有三套独立的生命周期:
Clean LifeCycle真正构建前,先清理
Default LifeCycle核心的构建部分:编译,测试,打包,安装,部署等
Site LifeCycle生成项目报告,站点,发布站点

以Default 生命周期为例,并列举部分常用的的阶段:compile -> test-compile -> test -> package -> install -> deploy

若执行 test-compile阶段,则真正被执行的有 compile -> test-compile

5.09、插件和目标

Maven核心程序只是定义了生命周期的各个阶段,以及每个阶段需要去执行哪个插件的哪个模块。

所以真正去执行时,会依赖本地仓库中的插件。Maven核心程序中并没有这些插件。

生命周期阶段调用插件调用插件的目标(模块)
compilemaven-compiler-plugincompile
test-compilemaven-compiler-plugintestCompile

5.10、依赖的传递性

  • 定义:若工程A依赖工程B,此时若在B中添加jar包,则工程A中也可以使用该jar包。
  • 注意事项:
需要在工程A的pom.xml中,配置好依赖信息
需要对工程B进行安装操作,确保本地仓库里存在工程B
只有compile范围的依赖才能够传递
  • 小技巧:可以在最底层的工程中把依赖的jar包配置好,其他工程只要想用这些jar包时,直接依赖这个底层的工程即可。

5.11、依赖的排除

  • 定义:工程A依赖工程B,工程B依赖b.jar。若工程A中不想要b.jar,则需要配置依赖的排除信息。
  • 配置信息:
<dependency>
	<groupId></groupId>
	<artifactId></artifactId>
	<version></version>
	<exclusions>
		<exclusion>
			<groupId></groupId>
			<artifactId></artifactId>
		</exclusion>
	</exclusions> 
</dependency>

5.12、依赖的原则

  • 作用:解决工程之间jar包的冲突问题
  • 路径最短优先:HelloFriend比Hello路径更短,所以MakeFriends会使用HelloFriend下的日志jar包

  • 依赖配置靠前者优先:当路径相同时,需要看MakeFriends的pom.xml中,配置依赖标签的先后顺序。

5.13、统一管理依赖的版本号

  • 场景:工程A依赖Spring的所有jar包,现在需要从4.0版本全部升级到4.1版本,如果手动一个个修改即繁琐还易错,使用配置的方式只需要更改配置的值即可。
  • 配置方式如下:
<!-->properties标签里使用自定义标签,自己命名即可<-->
<properties>
    <dfr.Spring.Version>4.0.0.RELEASE</dfr.Spring.Version>
</properties>

<!-->引用自定义标签<-->
<dependency>
	<groupId></groupId>
	<artifactId></artifactId>
	<version>${dfr.Spring.Version}</version>
	<scope></scope>
</dependency>

5.14、继承

  • 问题:由于test范围的依赖,并不具备依赖传递的特性,导致每个工程都需要声明依赖的jar包,容易造成版本不一致。
  • 解决思路:

创建父工程:父工程需要指定打包方式为pom。

父工程的pom.xml配置好jar的依赖,配置如下:

<!--dependencyManagement标签下声明的依赖,并不会被子类自动引入,还需要子类显示的去引用-->  
<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>com.dfr</groupId>
			<artifactId>test-jar</artifactId>
			<version>4.1</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

<!--dependencies标签下声明的依赖,会被子类自动引入-->  
<dependencies>
	<dependency>
		<groupId>com.dfr</groupId>
		<artifactId>java-jar</artifactId>
		<version>4.1</version>
	</dependency>
</dependencies>

在子工程的pom.xml中声明父工程:

<!--继承父类-->  
<parent>
  <groupId></groupId>
  <artifactId></artifactId>
  <version></version>
  
  <!-- 以当前文件为基准的父工程的pom.xml文件的相对路径 -->
  <relativePath>../Parent/pom.xml</relativePath>
</parent>

<!--依赖关系--> 
<!--未指定版本号,则使用父工程中指定的版本号--> 
<dependencies>  
	<dependency>  
		<groupId>com.dfr</groupId>  
		<artifactId>test-jar</artifactId>  
	</dependency>  
</dependencies>  

子工程声明jar包依赖时,不指明版本号。则以父工程中<dependencyManagement>标签下的统一设定为标准。同时子工程会自动引入父工程中<dependencies>标签下声明的依赖

  • 注意事项:设定了继承,在安装时需要先安装父工程,否则会报错。

5.15、聚合

  • 作用:一键安装各个模块工程
  • 思路:

新建一个工程或直接使用父工程。在pom.xml配合聚合信息。这样可以直接在聚合工程的pom.xml上进行install操作,就会把所有配置的模块都安装好。比如下面的配置在install后会按照如下顺序进行安装处理:springTest --》 yy --> parent

<groupId>parent</groupId>
<artifactId>parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>

<!-- 指定工程的相对路径 -->
<modules>
	<module>../springTest</module>
	<module>../yy</module>
</modules>
  • 注意事项:用作聚合的工程必须是父工程类型,即<packaging>标签的值为 pom。

6、在Myeclipse中使用Maven

6.1、配置Maven核心程序,本地仓库

Myeclipse自带Maven插件,但建议使用自己的Maven核心程序和本地仓库,配置方式如下:

Windows->Preferences

Installations:指定Maven核心程序的位置

user settints:指定Maven核心程序里conf/settings.xml的位置,进而获取本地仓库的位置。

 

6.2、创建Maven工程

  • 新建Maven版java工程

new Maven Project

勾选上 “Create a simple project” 选项,这样创建的目录更完整。

Packaging选择jar(java工程打jar包)

  • 新建Maven版的web 工程

new Maven Project

勾选上 “Create a simple project” 选项,这样创建的目录更完整。

Packaging选择war(web工程打war包)

创建后,有文件夹:src/main/webapp,但webapp下并没有WEB-INF,web.xml等web项目的约定目录。需要设置 web模板。

项目有红叉,但项目下却没有报错的问题,解决方案如下:https://blog.csdn.net/testcs_dn/article/details/36461747

6.3、执行Maven命令

点击pom.xml,右键 Run as :

6.4、其他配置

新建工程后,可能还需要手动调整jre的版本。可以在Maven核心程序的conf/settings.xml里配置profiles标签内容,指定版本。如果设置后识别不了,可能是因为Maven核心程序版本太低,而jdk设置版本太高导致。

<profile>
	<id>jdk-1.7</id>
	<activation>
		<activeByDefault>true</activeByDefault>
		<jdk>1.7</jdk>
	</activation>
	<properties>
		<maven.compiler.source>1.7</maven.compiler.source>
		<maven.compiler.target>1.7</maven.compiler.target>
		<maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>
	</properties>
</profile>

6.5、开发

工程A依赖工程B,若B没有安装到本地仓库,但是A和B都导入了Myeclipse,此时在Myeclipse中开发时,并不会受影响。只有最终全部开发完需要打包部署时,才需要全部安装到本地仓库。

7、Maven库站

获取jar包资源的坐标信息,网址:http://mvnrepository.com

搜索需要的jar包,可以找到如下坐标信息:

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐