一,Maven的下载安装和环境变量的配置
1.什么是Maven
Maven是一个项目管理和综合工具。Maven提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建Maven使用标准的目录结构和默认构建生命周期。
在多个开发团队环境时,Maven可以设置按标准在非常短的时间里完成配置工作。由于大部分项目的设置都很简单,并且可重复使用,Maven让开发人员的工作更轻松,同时创建报表,检查,构建和测试自动化设置。
2.Maven下载地址
http://maven.apache.org/download.cgi
3.Maven的目录结构
bin目录:Maven的运行脚本。mvn.bat是基于windows的脚本。在cmd中每次输入一条mvn的命令都是在调用并执行这些脚本。
boot目录:该目录只有一个文件plexus-classworlds-x.x.x.jar。他是一个类加载器的框架,相对于JDK中的类加载器,他提供了更丰富的语法以方便配置,Maven使用这个框架来加载自己的类库。
conf目录:该目录包含一个非常重要的文件setting.xml。配置该文件就能在project中定制Maven的行为。
lib目录:包含了所有Maven运行时需要的java类库以及用到的第三方类库。
LICENSE:软件许可证。
NOTICE:所包含的第三方软件。
README.txt:包含Maven的简介。
4.Maven的配置
将解压后的Maven的bin路径配置到环境变量path
5.测试是否配置成功
在dos窗口下输入mav -v查看Maven的版本信息
二,Maven的常用命令
Maven的工程结构和内容被定义在pom.xml中,全称为project object module。
1.创建工程
mvn archetype:generate
-DgroupId 公司名
-DartifactId 项目名称
-DarchetypeArtifactId 利用archetypeArtifactId模型(骨架)指定ArchetypeId:maven-archetype-quickstart->创建一个java project,maven-archetype-webapp->创建一个web project
-DinteractiveMode 是否使用交互模式
选择archetypeArtifactId模型(骨架):输入maven-archetype-quickstart,来找到编号。
输入1
选择骨架版本:输入7,之后会输入groupId,artifactId,version(项目版本号)和package(包名)。
输入Y信息确认
工程创建成功。
2.编译源代码
mvn compile
在工程目录下进入dos,输入命令。
工程中会多出一个target文件夹
3.清空
mvn clean
删除了target文件夹。
4.生成站点目录
mvn site
如果遇到一直报这个错误,意思是找不到org/apache/maven/doxia/siterenderer/DocumentContent
原因:doxia-site-renderer 1.8版本才有这个类,说明你maven-site-plugin插件版本高了,或者doxia-site-renderer低了
在项目的pom.xml中加入
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.7</version>
</plugin>
</plugins>
</build>
命令成功后项目会生成target\site目录。
5.安装当前工程的输出文件到本地仓库
mvn install
在本地仓库就有我们项目的包了
6.打包
mvn package
在target目录下就有我们项目的打包文件
mvn clean package
先清除再打包
三,坐标-仓库-生命周期
1.坐标
组成元素
groupId:一般代表公司名。
artifactId:一般为项目名。
version:版本号。
package:定义Maven项目的打包方式。
classifier:表示在相同版本下针对不同的环境或者jdk使用的jar。
2.仓库
仓库就是指存储所有项目的共享构件(包)的位置。
分为两大类:1.本地仓库,2.远程仓库。其中远程仓库分为:中央仓库,私服,其他公共库。
①本地仓库是在第一次执行maven命令的时候被创建,不是安装maven后创建。
②无论是Windows还是Linux,本地仓库的默认位置都是在用户目录下的.m2/repositpry/
③修改本地仓库的方式:
1.用户范围:把setting.xml放到.m2文件下。
2.全局修改:修改maven目录中setting.xml文件的localRepository。
3.Maven生命周期
1).Maven有三套相互独立的生命周期。
Clean Lifecycle:在进行真正的构建之前进行一些清理工作。
Default Lifecycle:构建核心部分,编译,测试,打包,部署等等。
Site Lifecycle:生成项目报告,站点,发布站点。
注意:运行任何一个阶段的时候,它前面的所有阶段都会被执行,这也就是为什么我们在运行mvn install的时候,代码会被编译,测试,打包。每个生命周期都包含一些阶段,阶段是有顺序的。
2).Clean Lifecycle
①pre-clean:执行清理前需要完成的工作。
②clean:清理上次构建生成的文件。
③post-clean:执行清理后需要完成的工作。
3).Default Lifecycle
①validate:验证工程是否正确,所需要的资源是否可用。
②compile:编译项目的源代码。
③test:测试已编译的源代码。
④package:已编译的代码打包。
⑤integration-test:将包处理和发布到一个能够进行集成测试的环境。
⑥verify:运行所有检查,验证包是否有效且达到质量标准。
⑦install:把包安装到本地仓库。
⑧deploy:在集成或发布环境下执行,将最终版本的包拷贝到远程仓库。
4).Site Lifecycle
①pre-site:生成项目站点之前需要完成的工作。
②site:生成项目站点文档。
③post-site:生成站点之后需要完成的工作。
④site-deploy:将项目站点发布到服务器。
四,依赖-聚合-继承
1.依赖
项目中需要引入的jar包称之为依赖。
在pom.xml的dependencies标签里加入dependency标签,具体信息可以去https://mvnrepository.com/查询。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
1)依赖的范围:依赖范围是用来控制与编译、测试、运行三总classpath的关系。<scope></scope>来设置依赖范围。
①compile范围
依赖的包会在编译的时候加入进来,并且在打包的时候也会把这个包加入进去。
②provided范围
在编译和测试的时候有效,在进行打包的时候不会加入进去。
③test范围
在测试的时候有效,在编译和打包的时候不会使用这个依赖。
④runtime范围
在运行的时候才会依赖,在编译的时候不会依赖。
⑤system范围
与provided类似,但是你必须显示的提供一个对于本地系统中jar文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven也不会在仓库中去寻找它。如果设置撑system范围,你必须提供一个systemPath元素。(该范围不推荐使用)
注意:在默认情况下scope的范围是compile。
2)依赖的传递性
如果A项目引入了a包,B项目引入了A项目,那么B项目也就引入了a包。
那么B项目怎么引入A项目呢?
在demo项目的pom.xml文件中,5-8行是demo项目的信息,那么其他项目可以dependency标签引入demo项目。
传递性的规则:
1.路径最近优先:c->b->a,c依赖b,b依赖a。那么c会优先使用b中的包。
2.路径相同配置在前优先:c->b,c->a,c依赖b,c依赖a。如果c把依赖b的代码写在前面那么就优先使用b的包。
去除依赖:
如果b->a,而你b中不想要a中的某个包就可以使用去除依赖。
1.选择性依赖(optional)
在a项目里引入的包中加入<optional>true</optional>
2.排除性依赖(exclusion)
在b项目里引用a项目的代码中加入exclusion标签
<dependencies>
<dependency>
<groupId>com.demo</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>不引入包的信息</groupId>
<artifactId>不引入包的信息</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
2.聚合
Maven的聚合功能可以通过一个父模块将所有要构建模块整合起来,将父模块的打包声明为POM,通过<modules>将各模块集中到父POM中。
创建父模块:
父模块目录:
创建子模块:
在父模块的pom.xml文件中加入<module>标签
点击父模块执行Maven命令发现一个错误
原因是父模块里没有子模块,把子项目复制到父项目里
刷新后就可以看到父模块中有子模块
再执行Maven命令就可以成功了。
另外可以右键父模块项目new Maven项目的时候选择Maven Module
这样就不用复制子模块到父模块中
3.继承
与面向对象的继承概念一样,通过继承消除重复编码的行为。父模块提取公共的部分,子模块使用<parent>继承父模块获取公共部分。
<parent>
<groupId>com.demo</groupId>
<artifactId>father</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
可继承的POM元素如下:
- groupId:项目组ID,项目坐标的核心元素
- version:项目版本,项目坐标的核心因素
- description:项目的描述信息
- organization:项目的组织信息
- inceptionYear:项目的创始年份
- url:项目的URL地址
- developers:项目的开发者信息
- contributors:项目的贡献者信息
- distributionManagement:项目的部署配置
- issueManagement:项目的缺陷跟踪系统信息
- ciManagement:项目的持续集成系统信息
- scm:项目的版本控制系统西溪
- malilingLists:项目的邮件列表信息
- properties:自定义的Maven属性
- dependencies:项目的依赖配置
- dependencyManagement:项目的依赖管理配置
- repositories:项目的仓库配置
- build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
- reporting:包括项目的报告输出目录配置、报告插件配置等
五.远程仓库的配置
两种方式:
1.修改setting.xml文件中的<mirror>标签
2.可以在pom.xml文件中指定仓库
<repositories>
<repository>
<id>maven-ali</id>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
</repository>
</repositories>