maven知识快速入门,了解开发中maven常用知识

对于java开发者来说,对于maven肯定不会陌生,在开发项目中,常常会使用到。通过使用maven,我们可以不用在具体项目中手动导入特定的jar包,只需要执行配置好pom.xml文件即可。

一、maven是什么

Apache Maven是一个项目管理和自动构建工具。基于项目对象模型(Project Object Model,POM)的概念,Maven可用来管理项目的依赖、编译、文档等信息。

二、maven的安装和使用

1、maven安装

安装maven需要安装JDK,maven包下载地址

1)下载JDK,安装JDK,同时添加“JAVA_HOME”环境变量。(在path环境变量目录下添加jre中的bin目录)这个不要弄错了,否则后面打包时,可能会出现错误。
2)把下载的maven包解压到目录下,添加“MAVEN_HOME”环境变量。

在命令行中输入java -version,查看java的版本信息,输入mvn -version,查看maven的版本信息。

2、maven的使用

这里仅仅讲解一下maven的简单使用方法,包括一些基本概念,使我们对maven有更多的了解,更多的用法可以去看官方的文档。maven文档

1)maven资源库

maven的资源库就是保存所有项目的jar库,插件或任何其他特定文件,并可以容易由maven来使用。

maven库中有三种类型:

  • local——本地库
  • central——中央库
  • remote——远程库
a.本地库

Maven本地存储是一个在本地计算机上的一个文件夹位置,本地资源库让你的项目可以依赖这些项目

当运行Maven构建时,那么Maven会自动下载所有依赖的jar到本地存储库中。

通过在maven的配置文件setting.xml当中更改

  <localRepository>D:/maven/repository</localRepository>

可以指定本地依赖库的位置。mac电脑maven配置如下图:
配置

b.中央库

Maven中央存储库是由Maven社区提供的资源库。它包含了大量的常用程序库。
当Maven没有在本地存储库找到任何依赖,就会开始搜索在中央存储库,它会使用下列网址

http://repo1.maven.org/maven2/

中央仓库的关键概念:

  • 此系统信息库由Maven社区管理
  • 它不要求配置
  • 搜索时需要互联网接入

通过https://search.maven.org/这个地址,可以对maven库中的jar包进行搜索。

c.远程库

Maven不能从依赖中央存储库找到上述库,那么它停下构建过程并输出错误消息到控制台。为了防止这种情况,Maven提供远程仓库概念,这是开发商的自定义库包含所需的库文件或其他项目jar文件。

Maven依赖搜索序列

当我们执行Maven构建命令,Maven依赖库按以下顺序进行搜索:

  • 第1步 - 搜索依赖本地资源库,如果没有找到,跳到第2步,否则,如果找到那么会做进一步处理。

  • 第2步 - 搜索依赖中央存储库,如果没有找到,则从远程资源库/存储库中,然后移动到步骤4,否则如果找到,那么它下载到本地存储库中,以备将来参考使用。

  • 第3步 - 如果没有提到远程仓库,Maven则会停止处理并抛出错误(找不到依赖库)。

  • 第4步 - 远程仓库或储存库中的搜索依赖,如果找到它会下载到本地资源库以供将来参考使用,否则Maven停止处理并抛出错误(找不到依赖库)。

2)maven常用命令
mvn -version  查看maven版本信息

创建web项目

mvn archetype:generate -DgroupId=net.anumbrella.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

mvn archetype:generate 创建项目固定格式
-DgroupId=net.anumbrella.app 组织标识(包名)
-DartifactId 项目名称
-DarchetypeArtifactId 执行项目的类型,如果是Java Project,使用maven-archetype-quickstart,Web Project使用 maven-archetype-webapp
-DintecactiveMode 是否使用交互模式

-DintecactiveMode是指当我们使用mvn archetype:generate 创建代码时,这个时候系统会显示所有的archetype类型,然后交互的提示我们输入对应的archetype,以及groupId和artifact Id。

比如我们只输入mvn archetype:generate,剩下的就是按提示输入选择序号,来生成我们需要的文件类型。

选择类型

mvn compile  编译源代码
mvn test-compile 编译测试代码
mvn clean 清空
mvn test 运行测试
mvn install 安装当前工程的输出文件到本地仓库Repository中
mvn package  生成target目录,编译、测试代码,生成测试报告,生成jar/war文件 

这三个命令的区别:
mvn compile,编译类文件
mvn install,包含mvn compile,mvn package,然后安装到本地仓库
mvn deploy,包含mvn install,然后,上传到私服

mvn jar:jar  打成jar
mvn eclipse:eclipse 生成eclipse项目
mvn deploy    打包后将其安装到pom文件中配置的远程仓库
mvn site       生成站点目录

三、maven的其他知识

1.maven中构建、坐标、仓库、私服、镜像的概念
a.构建

构建就是以当我们创建一个项目,无论是web项目还是纯java项目,我们得到具体的生成文件,可能是jar,war等包。这些文件可能也包含了许多其他的文件,比如框架配置文件,国际化文件,JSP文件等等一些列的文件。

而构建的过程主要包含以下几点,

①清理:删除以前的编译结果,为重新编译做好准备。
②编译:将Java源程序编译为字节码文件。
③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
④报告:在每一次测试后以标准的格式记录和展示测试结果。
⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对应 war 包。
⑥安装:在Maven环境下特指将打包的结果——jar 包或 war 包安装到本地仓库中。
⑦部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。

b.坐标和仓库

maven中的坐标,主要是指maven中重要的pom文件。一般pom文件包含我们运行项目需要的库文件,通过指定pom文件,我们可以构建下载需要的库文件。
如图所示:
指定库文件

groupId:项目或者组织的唯一标志
artifactId:项目的名称
version:项目的版本
packaging:打包机制
name:用户描述项目的名称,一般就是你的项目名称
url:写明开发团队的网站

其中groupId,artfactId及version是所有的pom文件必须拥有的。

将groupId、artifactId、version三个连起来
net.anumbrella.app+my-app+1.0.0-SNAPSHOT
构成的字符串就是在项目仓库中的目录:
net/anumbrella/app/my-app/1.0.0-SNAPSHOT/my-app-1.0-SNAPSHOT.jar

我们可以通过执行mvn clean install命令生成jar包到本地的仓库中。

在本地的仓库中,我们可以找到需要的文件。
本地库文件

c.私服和镜像

私服是什么,私服其实就是一个特殊的远程仓库,它是架设在局域网内的仓库服务。为什么要用私服?比如在局域网内,下载的速度比外网更快,maven构建时首先在私服上下载,没有找到库文件,再去远程的服务上下载文件,同时缓存在私服之上,然后为Maven下载请求提供服务。因此私服可以代理任何外部的公共仓库(包括中央仓库)。所以私服可以提高开发效率,提高稳定行,增强控制。同时私服提供更好的安全性,保障性,公司内部开放的代码jar上传到服务上,只有公司内部的人员才可以使用。

maven中的镜像,其实就是指一个仓库可以提供其他仓库的文件。比如阿里的maven仓库可以提供与中央仓库一样的文件,阿里仓库就是中央仓库的镜像。通过镜像我们可以提高下载速度。
比如下图的阿里镜像地址:

<mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>central</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

镜像的意思是,当你访问mirrors的仓库时,就会转到对应的镜像url中请求对应的资源。因此我们可以使用私服来构建本地的镜像文件库。

2.maven中的依赖、继承、聚合等概念
a.依赖

依赖就是通过在pom文件中指定具体的项目版本和具体的坐标来下载依赖某个包文件。说简单点就是在maven库中,含有依赖的具体架包。比如:

<dependency>
    <groupId>net.anumbrella.seaweedfs</groupId>
    <artifactId>seaweedfs-java-client</artifactId>
    <version>0.0.1.RELEASE</version>
</dependency>

这里就在pom文件直接指定了一个jar包的信息。同时依赖也是有范围的,依赖的范围主要有一下四个:

依赖范围(scope)对主代码有效对测试代码有效运行时代码有效是否参与打包例子
compile有效有效有效参与log4j
test无效有效无效不参与junit
provided有效有效无效不参与servlet-api
runtime无效无效有效不参与JDBC Driver


1、compile:有些依赖在主代码要导入,测试中也要导入,打包还需要上传到服务器上面,这些代码范围就是compile。
2、test:测试依赖范围。只有在测试时候需要,不需要打包到服务器上面,这些范围就是test。
3、provided:已提供依赖范围。对于编译,测试的代码都有效,但对于运行无效。因为由容器已经提供,例如servlet-api。
4、runtime:运行时提供。在本地写代码的时候,我们都是引入的jdbc接口,并不需要引入具体的jdbc驱动实现,运行的时候,我们需要使用范围为runtime。

依赖的递进关系:
比如A项目依赖B项目,B项目依赖C项目,那么A与C的关系是什么?这个取决于B与C的依赖范围。
当B与C的依赖关系为compile,那么A也依赖C。简单点说B为项目,C为log4j包(范围为compile),B依赖C,A依赖B项目,当然了,A项目下就有log4j包。当把C更为junit包(范围为test),这下A项目下就没有junit包了。

Maven依赖递进

依赖的排除关系:
通过在pom中使用 <exclusion> 标签来排除一些不需要同时下载的依赖jar 。
比如我们在项目中引用hbase的依赖,pom中的配置如下:
依赖

在maven库下面的依赖的文件如下:
库文件

比如现在我想排除掉log4j包,就在具体的dependency下添加如下代码:

        <exclusions>  
             <exclusion>     
                 <groupId>log4j</groupId>       
                 <artifactId>log4j</artifactId>  
             </exclusion>  
        </exclusions>  

通过 <exclusions> 可以包含指定多个</exclusion>文件。
排除jar

结果如下:
排除结果

其实也可以在eclipse中的点击pom文件后,选择排除文件。如下图:

eclipse操作

依赖的原则:
maven中依赖的原则有两条,一是路径最短者优先,二是路径相同,申明顺序其次。

这里的意思就是,比如:a项目的依赖为b、c架包,b架包为b->log4j_v1.1.jar,c架包为c->d->e->log4j_v1.2.jar。这时候路径最短的优先,所以a项目依赖的为b架包的log4j_v1.1jar。如果两个的路径长度相同,那么则根据在pom文件中定义的先后顺序来决定依赖。

b.继承

maven中如果继承关系不是compile,则依赖的继承不是按照完全继承来实现的。所以我们可以通过建立父工程文件,在父pom文件中统一管理版本,然后再在子项目目录中引用父工作的pom文件,就可以实现统一管理和继承。
比如父项目my-app如下:
父项目
更改packaging为pom类型。
在新建的子项目my-son的pom文件下,添加如下代码:

  <!-- 声明父项目 -->
<parent>
      <groupId>net.anumbrella.app</groupId>
      <artifactId>my-app</artifactId>
      <version>1.0-SNAPSHOT</version>
    <!-- 指定父项目pom文件的相对路径 -->
    <relativePath>../my-app/pom.xml</relativePath>
</parent>

然后我们可以在子项目中继承父项目,
子项目
我们可以看到在my-son项目中看到,子项目没有依赖任何库文件,但在父项目中的库文件继承到了子项目,说明继承起作用了。这样我们就可以在父项目中统一管理版本了。

c.聚合

maven中聚合指将多个工程拆分成多个模块后,需要手动逐个安装到仓库后依赖才能生效。每次修改代码都要mvn clean install,各个模块很多,就变得很麻烦。每次都要对各个模块操作。如果使用聚合,就可以方便操作管理。
maven中的聚合则使用 <modules><module> 标签来实现聚合。比如新建多个模块就可以使用到聚合。

<!-- 配置聚合 -->
<modules>
    <!-- 指定子项目的相对路径 -->
    <module>../my-app</module>
    <module>../my-son</module>
    <module>../my-test</module>
</modules>

即可实现在一个”总的聚合工程”中配置各个参与聚合的模块。然后在主模块中执行mvn clean install即可。如图所示:
打包1

打包2

maven的基本知识就介绍到这里,后面再介绍maven打包相关知识点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值