maven教程(一)定义与背景

maven的本质是一个跨平台的项目管理工具

它主要有两个功能:构建与依赖管理

(一)构建

构建是什么,以java源文件”,“框架配置文件”,“JSP”,“HTML”,“图片”等资源为原材料去生产一个可以运行的项目的过程

java语言为例,如果我们没有这些工具,我们就需要手动进行以下操作

  • 编译

编译我们自己写的源代码.java文件,形成.class文件。使用javac命令。

javac Hello.java

如果我们源码中使用到了第三方代码,就需要-classpath加入对应的jar包进去

javac -cp tom.jar Hello.java

  • 运行

使用java命令运行,也需要引入使用到的第三方jar

Java -classpath .;/home/wangke/tom.jar com.hello.wangke.Hello

运行java命令的时候,实际就是启动了一个虚拟机,系统提供了三种类加载器:

Ø 启动类加载器(Bootstrap ClassLoader),负责将存放在<JAVA_HOME>\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是JVM识别的jar包(仅按照文件名识别,如rt.jar,如果名字不符合,即使放在lib目录中也不会被加载),加载到虚拟机内存中

Ø 扩展类加载器,负责加载<JAVA_HOME>\lib\ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库

Ø 应用程序类加载器(Application ClassLoader),负责加载用户类路径(ClassPath)上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。

我们就要手动保证我们用到的所有类都能成功正确的被加载进来

  • 打包

打包为jar包、war包等

jar -cvfm hello.jar META-INF\MANIFEST.MF Hello.class Tom.class

该命令表示用第一个文件当做MANIFEST.MF文件,hello.jar作为名称,将Hello.classTom.class打成jar包。其中多了一个参数m,表示要定义MENIFEST文件

  • 运行单元测试  
  • 生成文档

以上一系列的操作:编译、运行、单元测试、生成文档、打包部署等,如果手工敲命令进行操作,则会非常繁琐并且重复

所以有一些IDEeclipseintelijIDEA等可以可视化的操作,但这又带来了大量的手动操作,引入依赖,编译,测试,这些都需要手动操作,手动操作意味着低效、容易出错。

缺点:

1.依赖大量的手工操作,效率低、容易出错

2.很难在项目中统一所有的IDE配置


所以就出现了我们的构建工具。

最早的构建工具是make,然后有了Ant,然后有mavengradle

就可以将我们从“编译,打包,部署,测试”这些程式化的工作上解放出来,我们只需要关注问题本身与解决

Maven对以上“编译,打包,部署,测试”的步骤梳理为自动化的脚本:

[1]mvn clean:清理

[2]mvn compile:编译主程序

[3]mvn test-compile:编译测试程序

[4]mvn test:执行测试

[5]mvn package:打包

[6]mvn install:安装

[7]mvn site:生成站点

[8]mvn deploy:部署


(二)依赖管理

比如我们项目依赖A,B,C,而他们底层还依赖其他第三方包

1)我们首先要知道他们之间的依赖关系,如果所有jar包之间的依赖都需要程序员自己非常清楚了解,那么极大增加学习成本

2)还需要手动将他们全部都引入,手动“复制”、"粘贴"WEB-INF/lib目录下

3)下载这些jar包也需要手动下载,去官网或者其他途径下载

 

为了解决以上问题,maven将每个三方包做了唯一标识,也就是依赖管理的底层基础-------坐标。Maven坐标的元素就包括:groupidartifactIDversionpackagingclassifier

Groupid:定义其隶属的公司或者项目,它的表示方式是域名反向一一对应,如spark项目:org.apache.spark

Artifactid:定义项目名或者模块名-

Version:项目的版本号

Packaging:定义打包方式,可以打包为jar包、war包等,不定义时默认为jar

上述5个元素中,groupidartifactidversion是必须定义的,packaging是可选的(默认为jar),而classifier是不能直接定义的

这个值是通过某些特定的插件生成的,比如我们打包a-1.0-javadoc.jara-1.0-sources.jar文档或者源码,javadocsources就是classifier


如果一个项目比较庞大,里面很多模块,那么groupid这一层就定义到项目名这一级别,artifactid定义到模块名,如spark的项目

<dependency>

    <groupId>org.apache.spark</groupId>

    <artifactId>spark-core_2.11</artifactId>

    <version>2.3.0</version>

</dependency>

<dependency>

    <groupId>org.apache.spark</groupId>

    <artifactId>spark-sql_2.11</artifactId>

    <version>2.3.0</version>

</dependency>

ArtifactID定义模块名的时候,推荐的做法是项目名称作为前缀。如果没有前缀,那么就会看到很多core_2.11-2.3.0.jar,而加了之后spark-core_2.11-2.3.0.jar才能比较好的识别

 

但如果是一个没有子模块的项目,则groupid这一层就定义到公司这一级别,artifactid定义到项目级别,如fastjson的项目

<dependency>

    <groupId>com.alibaba</groupId>

    <artifactId>fastjson</artifactId>

    <version>1.2.47</version>

</dependency>

比如我们自己的项目中:

<groupId>com.mycompany.department</groupId>
<artifactId>project1</artifactId>
<version>1.0-SNAPSHOT</version>

 

依赖管理

有了maven的坐标唯一标识之后,就可以做依赖管理了,就是通过一个核心的配置pom.xml

pom.xml中我们写入三个

可以看到它生成的依赖是多于3个了,因为这三个依赖自己底层还依赖其他,maven就帮我们把他们都引入进来了

能够引入进来的原因就是我们依赖的elasticsearchpom文件,它里面也有它自己的一系列依赖

所以坐标唯一标识一个项目

Pom定义项目之间的联系,通过配置的方式实现依赖管理



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值