Maven 基础知识总结笔记

Posted IT_Holmes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Maven 基础知识总结笔记相关的知识,希望对你有一定的参考价值。

1. 如何在eclipse中使用Maven?

1.1 Maven 配置eclipse


首先,我们需要先配置一些eclipse中的maven。


installations的配置:


User Settings配置如下:

1.2 创建Maven工程


我们去window =》perspective =》customize perspective,打开Menu Visiblity,选中new 下面的Maven project。这样方便我们创建Maven工程。

直接new 一个Maven工程就行,这里就和idea差不多了:选不选择骨架,普通java项目选择quickstart,web项目选择webapp等等。

中间可能涉及到一个library是1.5的情况,这个需要自己设置,也可以直接maven的setting.xml文件设置。

1.3 eclipse 使用Maven 命令


运行也不难,右键run as 就有一系列命令,但是里面灭有compile编译等等命令。

这时候需要点击Maven build…来创建一个compile命令。

2. Maven 聚合


如果多个模块之间存在依赖,如果我们更新修改其中的一个模块(例如:该模块修改后执行了maven install命令),那么肯定会影响其他模块。

那么就设定一个模块,来管理这些模块:(变动一个,伴随着其他模块也要变动,这种形式就叫做聚合)

聚合作用:用于快速构建maven工程,一次性构建多个项目/模块。


为了实现上面这种聚合方式:

第一:我们创建一个bom项目,将项目的src删除,并且配置pom.xml的packaging和modules标签。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>boss</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--定义该工程用于进行构建管理,也就是聚合-->
    <packaging>pom</packaging>
    <!--modules用于管理哪些工程,管理的工程列目标。-->
    <modules>
        <!--具体的工程名称-->
        <module>../java_test01</module>
        <module>../java_test02</module>
        <module>../WebAppTest01</module>
    </modules>

</project>

这是我们可以看到boss工程,后面会有root表示根的意思。


完成上面,我们就可以测试了,执行以下boss的compile文件看看其他项目会不会统一执行。

这时候会发现,他们都进行了compile编译,生成了target文件:


可以看到,我们在编译或安装打包时,它是有顺序的,顺序看依赖的顺序,如果依赖非常杂乱,还需要跟pom.xml的配置有关了。


最后说一下pom.xml下的packaging标签。

该标签不设置默认是jar。

jar是java项目,war是web项目,而pom是专门用来Maven聚合的!

3. Maven 继承



想要做到上面的效果就要用到继承。

通过使用parent标签和dependencyManagement标签,就是父工程来统一管理子工程:

之后,我们在每一个子工程中定义parent标签,确定父工程位置。

relativePath(相对位置)标签的作用就是方便找到父类工程。

这样,我们就可以统一管理各个项目的依赖版本了。
对于后面项目的依赖我们就不用指定版本就可以了


除了依赖,还可以统一管理插件,使用pluginManagement标签。


总结,我们就只在父类配置好了,到了子类不用在配置版本之类的,从而达到一个依赖版本和插件版本统一的效果。

因此,这个继承就一个依赖和插件的父子工程的过程。

此外,父类的一些其他配置信息也是可以继承到子类的:


聚合和继承是可以放到一个工程中,也可以分开做两个模块,不影响。一般我都放到一个工程,这个工程也就是设计工程,不写东西,仅仅是来统一管理的。

4. Maven 属性

4.1 自定义Maven属性


这里的属性,其实和java中的变量差不多,通过修改一个属性变量,进而调用该属性的变量都会被赋予修改成的值,大体意思效果就是这样。

Maven使用properties标签来定义属性。

一般自己属性标签起名字的格式差不多像这样:

<spring.version></spring.version>

4.2 Maven 属性的分类


Maven 属性的分类:

  • 自定义属性
  • 内置属性
  • Setting属性
  • Java系统属性
  • 环境变量属性

自定义属性:

自定义属性是用的最多的,等同于java中的变量,方便统一维护。


内置属性:

其实在maven项目中,就有很多内置的属性。

$version属性:就是调用当前工程的version。

$basedir属性:获取项目根目录路径。

其实它们前面是有个project,project是可以省略的。


Setting属性:

使用maven配置文件setting.xml中的标签属性,用于动态配置。

例如:$settings.localRepository


Java系统属性和环境变量属性:

读取Java系统属性:

例如:$user.home

当然还有系统查询的方式:

例如:mvn help:system

通过mvn help:system命令,得到两种属性:系统属性和环境变量属性。

下面这个就是系统属性:

环境变量属性:

例如:$env.JAVA_HOME

5. Maven 版本管理


SNAPSHOT(快照版本):

  • 快照版本就算是测试阶段的版本。
  • 快照版本会随着开发的进展不断更新。

RELEASE(发布版本):

  • 项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本成为发布版本。

上面这两种是比较常用的,也有些企业起的名字不同,有rc,m等等一系列,这倒不用在意。


工程版本号的约定:

6. Maven 外部资源加载 属性值


我们设置jdbc的一些信息时,常存储在jdbc.properties里面:

但是我们想也让这里面的值,使用属性值来代替,也是可以的(也就是想让外部文件也使用当前pom.xml设置的属性值):

这就分为:配置资源文件对应的属性和测试资源对应的属性,也就是main下的resources和test下的resources。


配置资源文件对应的属性(使用resources标签):

第一步:我们设定好属性值:


第二步:在build标签内设定resources标签,负责指定文件路径目录:


filtering属性作用:开启加载pom属性过滤功能,就是设置为true才能被加载到。

最后,我们install一下,在jar包中查看jdbc.properties是否配置成功了。

最后,我们可以通过内置属性,来修改一下:


配置测试资源的对应信息(使用testResources):

其实本质上没啥区别,就是标签换成了testResources 和 testResource,注意路径要改成test,仅此而已。

7. Maven 多环境开发配置(多环境兼容)


我们所建成的项目,在当前能够运行成功,但如果放置到服务器上就有可能环境不兼容等,换句话说,每次放到新服务器都要配置一下环境值等等。

定义这种多环境开发,Maven也是可能做的,还是去聚合工程配置pom.xml文件。
光配置好肯定不行,我们在运行时,还要指定我们运行哪一个环境的id,因此执行命令的时候需要我们,添加参数!

因此,我们执行mvn指令时,要添加-p:

例如:mvn install -P [指定的环境id]


上面还可以通过使用 activation 和 activeByDefault 默认方式来启动环境配置:

8. Maven 跳过测试


真正开发中,测试是不能跳过的!

在某些特殊情况下,我们通过跳过来检查那一部分出现问题或者来节约时间等等。


方案一:

idea的跳过测试:


方案二:

通过命令来跳过测试环节:

mvn install -D skipTests

-D的作用是指定Java全局属性。


方案三:(针对插件而言)

我们设置插件后,可以在configuration标签内设置skipTests标签,来决定该插件测试时跳不跳过。


对于插件而言,我们想要哪一个测试,哪一个不需要测试,也是可以直接来定义的如下:

9. Maven 私服(nexus)

9.1 nexus 安装 和 启动


私服有很多,不过现在比较常用的是nexus私服,平时我们打的游戏也是有私服区分的。

私服在开发中很重要!

平时我们下载插件jar包等等都是直接在中央Maven仓库下载,那是公共的。

如果我们开发项目中,每一个负责的工程模块不同,需要彼此模块时,总不能通过u盘拷贝,飞秋发送啥的来操作。这个时候就需要私服,我们将项目打包到私服,谁用,谁拿,一样原理。

私服和中央仓库是分离开的!


nexus 私服服务器下载地址:

https://help.sonatype.com/repomanager3/product-information/download

解压后,有两个目录分别对应如下:


启动配置如下:

执行 nexus /run nexus命令:

启动后,看到如下图片,我们就可以去http://localhost:8081网页下查看了。

http://localhost:8081/ 网页如下,看到当前页面表示我们启动成功了:


如果我们想要修稿一些nexus基础配置信息,如端口地址等等,需要去etc下修改nexus-default.properties文件中的内容:

还有一个nexus服务器启动对应的配置信息,在bin/目录下的nexus.vmoptions文件中配置。


9.2 私服的仓库分类 与 手动上传组件

9.2.1 仓库分类


私服有多种类型的仓库,分别对应不同的作用。

对应上图的三个不同类型的仓库:宿主仓库hosted,代理仓库proxy和仓库组group。


宿主仓库hosted:

  • 保存无法从中央仓库获取的资源,如自主研发的项目,第三方非开源项目(例如:oracle , 因为第三方非开源在maven中央仓库是找不到的!)
  • 宿主仓库就是上面在仓库组中的仓库。

代理仓库proxy:

  • 代理远程仓库,通过nexus方位其他公共仓库(中央仓库或镜像)。
  • 就对应上图的黄色仓库,像spring-context这样的资源,我们一般不可能在自己的仓库中存放,我们可以间接的通过代理仓库proxy从中央仓库获取。

仓库组group:

  • 将若干个仓库组成一个群组,简化配置。
  • 仓库组不能保存资源,属于设计性仓库。
  • 仓库组的作用就是如果一个项目同时需要多个宿主仓库中的程序,那么我们就可能通过仓库组给它们划分,这样我们就直接访问仓库组,进而访问所有要访问的仓库信息。

9.2.2 各个仓库的使用


首先,我们进入nexus主页面,点击右上角sign in登录,密码会提示告诉你放到你文件中的一个.password文件中。

登录后,点击左侧的Browse,就可以看到很多不同类型的仓库了:


创建一个hosted宿主仓库:


这样,一个宿主仓库就创建完成。之后我们在将宿主仓库放到仓库组中。

这样创建仓库和添加仓库组等等就完成了。

9.2.3 网页手动上传组件


需要注意,snapshot版本的仓库没有下面的按钮的,只有release版本才有。


注意:snapshot不能被上传的release类型的仓库中。

10. 本地的maven仓库 和 私服仓库建立联系



此外,上面的本地,就是我们自己安装的maven本地仓库,要通过本地仓库来进行一个上传下载到私服的过程。

首先,找到我们本地仓库的setting.xml文件,进行配置。

我们需要配置仓库组的地址信息,我们可以通过nexus主页面获得到url地址信息。

此外上面,mirrorOf标签中的 * 代表所有的东西都从这里面拿到;如果时central的话,就是中央仓库的东西在这里面获取。

完成上面的一些列操作,则我们本地的仓库就可以与私服进行联系了。

11. 使用idea访问私服 和 组件上传


在项目本身的pom.xml中也要配置好,当前项目要上传到的位置:

<!--发布配置管理-->
<distributionManagement>
    <!--release版本,要对应我们在本地setting设置的id名称-->
    <!--发布不同版本找不同版本对应的地址,这里的版本看的是当前项目的version版本是snapshot还是release。-->
    <repository>
        <!--通过id,去查找本地maven的setting文件中的server下的id对应的用户名和密码。-->
        <id>itholmes-release</id>
        <!--url地址,也是要去nexus主页面去copy。-->
        <url>http://localhost:8081/repository/itholmes-release/</url>
    </repository>
    <!--snapshot版本-->
    <snapshotRepository>
        <id>itholmes-snapshot</id>
        <url>http://localhost:8081/repository/itholmes-snapshot/</url>
    </snapshotRepository>
</distributionManagement>

配置好后,我们制定display命令插件,就完成了发布到私服的效果。

Maven的deploy插件用于把Maven自动构建生成的版本发布到中央代理仓库如Nexus服务器上,也能把第三方依赖库(如Jar包)或一个独立的Jar包直接发布到中央代理仓库供大家共享使用。

以上是关于Maven 基础知识总结笔记的主要内容,如果未能解决你的问题,请参考以下文章

Maven 基础知识总结笔记

Maven 学习笔记 基础环境搭建

springmvc学习总结 -- maven+springmvc+spring+mybatis+mysql详细搭建整合过程讲解

Maven学习笔记总结

Maven学习笔记总结

Maven基础-00-笔记