Maven学习:
1.Maven介绍以及环境搭建
简介:
基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。-----主要用来管理项目,是一套强大的自动化工具(编译、清理、测试、打包和部署),统一管理所依赖的第三方的Jar包
环境搭建:
①下载maven资源包(http://maven.apache.org/,左侧导航栏,选择Download,选择Link中****-bin.zip)
解压后,目录主要包含以下
bin目录--mvn运行脚本以及对应的配置文件
boot目录--类加载文件,maven以此加载
conf目录--配置文件(settings.xml会经常用到)
lib目录--maven运行时所用到的的类库
②配置maven的环境变量
M2_HOME:D:\ToolsForJAVA\apache-maven-3.5.2\apache-maven-3.5.2
Path中添加%M2_HOME%\bin
Eclipse中Maven的配置
③验证mavn环境是否配置成功
win+R(cmd)输入命令
mvn -v
若有maven版本信息提示则证明环境配置成功
④测试
构建两个类(main和test)
构建porm.xml
这里porm.xml中,<modelVersion>代表版本号,是固定的
<groupId>代表项目的包名
<artifactId>代表模块名,建议使用项目名
<version>很多形式,测试联系中使用0.0.1SNAPSHOT(快照)
<dependencies>代表jar包依赖部分开始
<dependency>代表的是每一个jar包,其中包括所依赖的该jar包的包全名(<groupId>)、模块名(<artifactId>)以及jar包版本(<version>)
构建完成后,将porm.xml放入项目的根目录
命令行进入项目根目录下,执行mvn compile(对该项目进行编译,当有提示BUILD SUCCESS说明编译成功)
在mvn compile成功后,可以进行测试用例的运行--mvn test,一般成功会返回BUILD SUCESS,如果编译错误会返回BUILD FAILURE,并给出相应的提示信息。
(这里,一般在编译和运行测试用例的时候,如果出现错误给出的提示大多数为中文的,但运行测试用例的时候,一般多为英文提示)
在完成以上步骤之后,通常会有在项目的根目录下,生成一个文件夹--target
⑤关于mvn运行后的target文件夹
target下的目录
-classes:编译后生成的main中java文件对应的class文件
-maven-status:(暂无)
-surfire-reports:生成的测试报告
-test-classes:(暂无)
⑥mvn package--通过mvn生成一个相关项目的jar包以及在target文件夹下生成一个名为maven-driver的文件夹
2.maven常用的构建命令
mvn v -- 查看maven的版本
mvn compile -- 通过maven进行编译
mvn test -- 通过maven进行单元性测试
mvn package --通过maven进行打包
mvn clean --通过maven对target路径下编译后的class文件和测试报告进行清除
需要进入到项目的根目录下进行命令的运行
运行后target文件夹就呗删除了
mvn install --安装jar包到本地仓库中
在其他项目或者其他目录下需要引用另一目录或另一项目中的某个类时,需要先进入该类的根目录下,对该类进行install操作,将该类形成的jar包放入maven仓库中
放置后,需要在porm.xml中对该类对应的仓库中形成的jar进行依赖
完成以上两步后才能实现跨级间的本地jar包依赖引用
注:通常maven引入jar包,根据porm文件中写出的坐标在本地中央仓库中查找是否存在,若不存在则会去配置好的中央仓库根据坐标查找并下载到本地仓库中
3.maven自动建立目录骨架
archetype插件用于创建符合maven规定的目录骨架
创建项目(可以直接在工作间内创建项目名文件夹)
管理员运行命令提示符
进入新创建的项目名的文件夹路径下,即项目根目录。运行命令--mvn archetype:generate
运行过程中会需要输入maven版本
注:这里的要输入的版本号,更是接近于maven项目的结构号,不同号生成的porm文件中依赖的包是不一样的,有的版本号中引用的是搭建SSM需要引入的jar包,有的是搭建其他框架项目需要用的包。需要根据实际情况去选择。前提是需要这些版本号所代表的意思。
输入后会紧接着提示要创建的groupId,这里可以输入全名
之后再输入artifactId
最后是版本号version
--另一种方式可以一次性设置完所有的属性-mvn archetypr:generate -DgroupId=(注:这里是示例)com.test.maven04 -DartifactId=maven04-demo -Dversion=1.0.0SNAPSHOT -Dpackage=com.test.maven04-demo
4.maven中的坐标和仓库
构件:在maven项目中任何一个依赖、插件、项目构建的输出都可以称为构件
坐标:所有构件都通过坐标作为其唯一标识
仓库:管理maven依赖的工具,分为本地、远程与镜像
maven默认提供一个全球仓库的地址,可以通过D:\ToolsForJAVA\apache-maven-3.5.2\apache-maven-3.5.2\lib目录下的maven-model-builder-3.5.2.jar包中的pom文件中的repository中的连接来访问全球仓库
修改镜像仓库:在setting.xml中
<!--<mirror>
<id>maven.net.cn</id> ——表示该镜像仓库的id
<mirrorOf>central</mirrorOf> ——为那个仓库配置镜像 可以指定仓库名,也可以使用通配符*,源仓库将不能访问
<name>central mirror in china</name>
<url>http://maven.net.cn/content/groups/public</url>
</mirror>-->
修改本地仓库存放位置:在setting.xml中
<localRepository>D:\ToolsForJAVA\repo</localRepository>
5.maven的生命周期
完整的项目构建过程:清理、编译、测试、打包、集成测试、验证、部署
maven生命周期:clean 清理项目——1.pre-clean执行清理前的工作 2.clean清理上一次构建生成的所有文件 3.post-clean执行清理后的文件
default 构建项目(最核心)——compile、test、package、install(单独运行package时,compile与test会自动执行)
site 生成项目站点——1.pre-stie在生成项目站点前要完成的工作2.site生成项目的站点文档3.post-site在生成项目站点后
要完成的工作4.site-deploy发布生成的站点到服务器上
对于maven插件(source)的使用示例:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
6.pom.xml常用元素介绍
<project>//project为pom文件的根元素,里面时一些约束信息
<modelVersion>指定了当前pom的版本</modelVersion>
<groupId>主项目的标识,反写的公司网址+项目名</groupId>
<artifactId>标识,项目名+模块名</artifactId>
<version>版本号,大版本号.分支版本号.小版本号,如0.0.1snapshot(快照版)
alpha内测版
beta公测版
Release稳定版本
GA正式发布版本
</version>
<packaging>maven项目的打包方式,默认是jar,还有war、zip、pom</packaging>
<name>项目描述名 一般是在产生项目描述文档时使用</name>
<url>项目地址</url>
<description>项目描述</description>
<developers>项目开发人员列表</developers>
<licenses>许可证的信息 ,用到一些开源框架会有该标签</licenses><!-- -->
<organization>组织机构信息</organization>
<dependencies>//依赖列表,其中包含多个依赖项
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<scope>test</scope>//依赖范围
<type></type>
<optional></optional>//设置依赖是否可选,默认false(默认此项目时继承的),true则需要显示的引入该依赖
<exclusions>//排除依赖传递列表
<exclusion></exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>//依赖管理,主要用于父模块中定义,供子模块使用, 也就是直接在父模块中定义,子模块继承就好
<dependencies>
<dependency></dependency>
</dependencies>
</dependencyManagement>
<build><!-- 通常为构建进行支持 -->
<plugins><!-- 插件列表 -->
<plugin></plugin>
</plugins>
</build>
<parent>通常用于在子模块中对父模块的pom的继承</parent>
<modules>用来聚合多个maven项目,如果有多个maven模块需要编译,就可以在该标签中定义,一起编译</modules>
</project>
7. 依赖的范围
可见依赖组件中的<scope>标签
具体的scope有何种属性可以通过apache官网上得知:compile---默认,编译测试运行都有效
provided--测试和编译时有效(servletAPI与web容器)
runtime---测试和运行时有效(jdbc)
test------测试时有效
system----于本机系统相关联(可移植性差),编译和测试时有效
import----导入的依赖范围,只是用在依赖管理中时使用
8. 依赖传递
通俗意义上是指,maven项目A、B、C,B依赖于A,C依赖于C,即C->B->A。这里在实现互相依赖的方法上就是在C的pom的文件中放入B的坐标信息
在B的pom文件中放入A的坐标信息。但是,要预先给项目A打包构建,B打包构建,这样C才能构建成功,否则会编译报错。
由于C依赖的B,先依赖于A,则由于依赖的传递性,C也同理会依赖于A,如果想要C只依赖于B,则需要用到<exclusions>标签
在该标签中放入A的坐标。
**依赖冲突**
*短路优先*
以上面的依赖关系举例——A与B同时依赖某jar包,例:common-io分别依赖于2.4与2.0两个版本,那么C中会优先依赖B中的2.0版本。
*路径相同声明优先*
假设B与A没有依赖关系,C同时依赖于A和B,此时两个依赖路径相同,此时如果在C的pom文件中,A的坐标在B的坐标上面,则依赖A的2.4版本,反之,则为2.0的版本。
9. 聚合与继承
**聚合**
若有A、B、C、D四个maven项目,如果要实现在D项目中聚合ABC三个项目,则需要在pom文件中运用<modules>标签
**继承**
若有A、B两个maven项目,要实现B继承A,则需要在B中使用<parent>标签
10. 关于pom文件中的<properties>
一般可以自定义一些标签,例如依赖组件的版本号等。