Maven是Java世界中一个很好使的项目管理工具,关于【好使】这个特性从项目的使用量上就能体现出来,虽然说现在有更好使的Gradle,但是Maven的地位也不会那么轻易被撼动,支持者还是多多。

Maven的产生背景

在学习一个新知识之前,应该要以历史的眼光来看待这个技术出现的原因,以及这个技术解决的问题,也就是背景,这样能更好地理解这个技术。

在没有Maven之前,开发一个项目,当需要用到别人写的代码的时候,基本上是这样的:

1.开发一个项目,当需要用到别人写好的jar包,就需要把开源的jar包下载下来放到项目的lib目录下,并且根据这个目录添加到CLASSPATH中,以此来告诉Java执行环境,在哪些目录下可以找到要执行的Java程序需要的类或者包。

2.当下载了aa.jar包之后,发现还需要依赖bb.jar包,于是就去下载bb.jar包,重复步骤直到下载并添加完所有需要的jar包。

3.如果运气好,项目在添加完所有的依赖之后就能够正常运行了。但是如果运气差的话,就会遇到版本的问题,比如aa.jar包在调用bb.jar包的时候发现bb.jar包中根本没有需要的方法,这个方法只存在在bb.jar包别的版本中,那么这样的话,就需要花不少的时间在查找依赖和适配版本的jar包上了。

4.另外的,往git或者svn上提交代码的时候,还必须要把这些lib都上传上去,否则别人就要重复你前面做过的所有查找和添加依赖的操作。同样的,别人下载你的代码也是要把完整的lib下载下来。这样,不仅会浪费代码版本管理的时间,代码版本管理的空间,还会提高的开发的时间成本和降低开发的效率。

这时候Maven作为Java世界中的包管理工具就应运而生。就好像Linux世界中的yum、Web前端世界中的webpack一样,是一种方便开发者管理各种依赖的包管理工具。

Maven仓库的种类

Maven查找jar包的过程是这样的:先在本地仓库找;找不到的话,就去私服找(如果配置了私服的话);再找不到,就到中央仓库去找(默认的中央仓库是http://repo1.maven.org/maven2/,由Maven团队负责维护)。

最后如果在中央仓库找到之后,就会在私服和本地仓库都放一份,从私服找到之后也会在本地仓库放一份,这样下次再查找依赖就不需要到中央仓库去下载了。

关于仓库的配置,当你安装(Windows下一般是解压和配置环境变量)好了Maven之后,Maven的安装目录在conf目录下会有一个settings.xml配置文件,这个配置文件中提供了很多的配置项,其中就有配置仓库的配置项,包括本地仓库、私服和中央仓库的配置。

关于私服首先要搭建私服,比较繁琐,需要用另外的篇幅来记录,因此这里就略过私服的配置,只提及本地仓库和中央仓库的配置。

本地仓库的配置是通过localRepository标签配置的:

<!-- localRepository| The path to the local repository maven will use to store artifacts.|| Default: ${user.home}/.m2/repository  -->
<localRepository>D:\maven_repo</localRepository>

中央仓库的配置是通过mirrors-mirror标签配置的(这里设置为淘宝镜像):

<mirrors><!-- mirror| Specifies a repository mirror site to use instead of a given repository. The repository that| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.|<mirror><id>mirrorId</id><mirrorOf>repositoryId</mirrorOf><name>Human Readable Name for this Mirror.</name><url>http://my.repository.com/repo/path</url></mirror>--><mirror><id>nexus-aliyun</id>  <mirrorOf>central</mirrorOf>    <name>Nexus aliyun</name>  <url>http://maven.aliyun.com/nexus/content/groups/public</url>  </mirror>
</mirrors>

需要注意的是,这些配置项如果不进行配置的话,Maven是提供有默认值的,默认值都在注释掉的配置项中。

在自身的属性配置这一点上,Maven都贯彻了【约定优于配置】的理念,真的是优秀啊。

Maven项目的整体结构

Maven遵循的原则是【约定优于配置】,因此使用Maven构建的项目的默认结构是下图这样的:

1.Maven默认配置了${project.basedir}/src/main/java为项目的源代码目录。
2.Maven默认配置了${project.basedir}/src/main/test为项目的测试代码目录。
3.Maven默认配置了${project.basedir}/target为项目的编译输出目录等。

。。。

当然了,既然说是默认配置,当然是可以修改的,可以在项目的pom.xml的build标签中修改这些源代码目录,只是一般不建议改,一般人也不会去改。

<build>  <sourceDirectory>src/java</sourceDirectory>  <testSourceDirectory>src/test</testSourceDirectory>  <outputDirectory>output/classes</outputDirectory>  <testOutputDirectory>output/test-classes</testOutputDirectory>  <directory>target/jar</directory>
</build>

Maven项目结构的特殊性是由【约定优于配置】的特性来决定的,这一特性减少了很多不必要的配置,是使之打败前辈Ant的主要原因之一。

Maven管理工具的目录结构

下图是Maven管理工具的目录结构。

bin目录:该目录包含了mvn运行的脚本,这些脚本用来配置Java命令,准备好CLASSPATH和相关的Java系统属性,然后执行Java命令。

boot目录:该目录只包含一个文件,该文件为plexus-classworlds-2.5.2.jar。plexus-classworlds是一个类加载器框架,相对于默认的Java类加载器,它提供了更加丰富的语法以方便配置,Maven使用该框架加载自己的类库。

conf目录:该目录包含了一个非常重要的文件settings.xml。直接修改该文件,就能在机器上全局地定制Maven的行为,即对所有用户都生效。一般情况下,我们更偏向于复制该文件至~/.m2/目录下,然后修改该文件,在用户级别定制Maven的行为。

lib目录:该目录包含了所有Maven运行时需要的Java类库,Maven本身是分模块开发的,因此用户能看到诸如maven-core-3.0.jar、maven-model-3.0.jar之类的文件,此外这里还包含一些Maven用到的第三方依赖如commons-cli-1.2.jar、commons-lang-2.6.jar等等。

settings.xml配置文件

这里详细说一下settings.xml这个文件,这个文件用于定制Maven的行为。上面已经说到settings.xml可以放在2个位置,一个是【~/.m2/setting.xml】(默认没有,需要我们自己复制),一个是【${maven.home}/conf/setting.xml】。这2个位置的配置文件的加载顺序为【~/.m2/setting.xml】>【${maven.home}/conf/setting.xml】,为了不影响他人,所以我们将conf下的settings.xml复制到用户目录,在用户级别定制Maven的行为。

这个和系统配置环境变量有点类似,Windos和Linux都可以配置系统级别的环境变量和用户级别的环境变量,用户级别的环境变量会覆盖系统级别的环境变量。

Maven的一些常用命令

要使用Maven当然要会一些常用的命令,不然都不叫会使用Maven。

命令 描述
mvn -version 显示版本信息
mvn clean 删除target目录
mvn compile 编译src/main/java下的源代码
mvn package 打包,在target下生成jar包或者war包
mvn test 执行src/test/java下以Test开头或者以Test结尾的类的测试用例
mvn install 打包,并把jar包或者war包复制到本地仓库,供其他模块使用
mvn deploy 将打包的文件发布到私服
mvn dependency:tree 打印出项目的整个依赖树

当然也可以将命令连着使用,比如使用【mvn clean package】清理打包;比如使用【mvn clean package -DskipTests=true】清理打包,并跳过测试用例;比如使用【mvn clean install】清理打包,并将jar包或者war包复制到本地仓库。

更多的,也可以配合将结果输出到文件来方便查看,比如【mvn dependency:tree > dependency.txt】。

pom.xml中的<dependency>标签

<dependency>标签中一般是包含<groupId>、<artifactId>和<version>三个子标签。

<groupId>表示公司域名倒过来,<artifactId>表示功能的命名,<version>表示版本号,这三个维度就确定了一个jar包,就像用(x, y, z)坐标在三维空间中确定一个唯一的点一样。

另外的,<dependency>标签中还可以包含<scope>标签,表示此依赖包的作用范围,下面列出一个<scope>参数候选值的表格。

参数 解释 是否会被打入最终的jar包
compile 默认的scope(不指定)
test 测试使用
provided 编译需要
runtime 编译不需要,运行时需要(接口与实现分离)
system 加载本地jar(很少使用)

"长得丑的水果,都会努力让自己甜一点。"

转载于:https://www.cnblogs.com/yanggb/p/11078256.html

maven的基础入门相关推荐

  1. Maven - 基础入门与安装配置

    Maven - 基础入门与安装配置 [1]Maven基础入门 Maven的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成.而插件本身并不包含在Maven的核心程序中. 当我们 ...

  2. Jenkins 基础入门

    原文地址:Jenkins 基础入门 博客地址:http://www.extlight.com 一.前言 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作, ...

  3. SpringBoot2.x(3)---基础入门

    SpringBoot2.x(3)---基础入门 一.概述 Spring Boot设计目的是用来简化新Spring应用的初始搭建以及开发过程.Spring Boot并不是对Spring功能上的增强,而是 ...

  4. Java 基础入门,小白提升路线图

    1000+最新Java面试题 获取学习路线资料啦 Java的基础知识就像我们所住的房子的地基,如果地基不稳,上面所盖的楼房再宏伟,也是没人敢去入住的,同理Java的基础不牢固,以后也很难成为真正意义上 ...

  5. Android Studio新手–下载安装配置–零基础入门–基本使用–调试技能–构建项目基础–使用AS应对常规应用开发

    转自:http://blog.csdn.net/yanbober/article/details/45306483 目标:Android Studio新手–>下载安装配置–>零基础入门–& ...

  6. Java基础入门:IDEA软件安装和软件初始化设置

    IDEA是一个专门针对Java的集成开发工具(IDE),由Java语言编写.所以,需要有JRE运行环境并配置好环境变量. 它可以极大地提升我们的开发效率.可以自动编译,检查错误.在公司中,使用的就是I ...

  7. SpringBoot2核心技术最好的一篇文章——1.基础入门

    SpringBoot核心技术 基础入门 一.Spring与SpringBoot 1.1 SpringBoot的优点 1.2 SpringBoot缺点 1.3 详细讲解请观看尚硅谷雷神 二.Spring ...

  8. elementUi基础入门学习

    elementUi基础入门学习 1.前后端分离(理解) 1.1什么是前后端分离 1.2 前后端分离开发的理解 1.3 为什么要进行前端分离开发: 2 . 先去搭建前端服务 3 elementui 4 ...

  9. Spring Cloud Alibaba基础入门,一周学会基操!

    Spring Cloud Alibaba基础入门,一周学会基操! 服务拆分: 1.不同微服务,不要重复开发相同业务 2.微服务数据独立,不要访问其它微服务的数据库 3.微服务可以将自己的业务暴露为接口 ...

最新文章

  1. Mycat 读写分离 数据库分库分表 中间件 安装部署,及简单使用
  2. getcontentpane java_java – 为什么getcontentpane()未定义?
  3. python飞机大战的实训心得体会-python之基础总结(飞机大战)
  4. python三层装饰器-python中自带的三个装饰器的实现
  5. linux下使用gcp拷贝数据的时候显示进度条
  6. JAVA ee6 result结果集_java对数据库的表插入操作时,显示已生成用于更新的结果集...
  7. 《众妙之门——Web用户体验设计与可用性测试》一2.3 总结
  8. docker18.09.3修改守护进程配置文件不生效问题
  9. bin文件转换成html,怎么样把BIN文件转换成ISO文件
  10. Ajax 的乱码问题(2)
  11. Educational Codeforces Round 101 (Rated for Div. 2) F. Power Sockets 哈希 + 乱搞
  12. git 怎么提交忽略文件夹_git 设置忽略文件提交的几种方式
  13. android自定义tab的分隔符,TabView中的分隔符
  14. DrawPrimitiveUP And DrawIndexedPrimitiveUP
  15. CUDA C程序中的函数类型
  16. MyBatis官方文档——Java API部分
  17. python代码写龙卷风_python-打开网站时龙卷风403获取警告
  18. Java显示smart3d数据_[转][smart3d]Smart3D之手动配置 S3C 索引加载全部的OSGB瓦片数据...
  19. APIO2007风铃
  20. [CTF]利用CRC32绕过RAR密码(适合于小文本文件)

热门文章

  1. (转)OAuth 2.0的设计思路
  2. 你造吗?这个属性值你写错了多少年?target=“_blank”
  3. mysql怎么从1开始递增
  4. 软件设计师11-数据库
  5. Linux运维问题解决(2)——Linux设置定时重启系统的方法:定时任务crontab 和 编写脚本
  6. 关于职场的6个深刻道理,每个都是血泪教训换来的,你一定要懂
  7. 手把手教你从0-1做一张酷炫驾驶舱,让老板对你赞不绝口
  8. android应用程序列表,List列表应用程序-小知识 #103
  9. php-fpm nginx 关系,nginx 和php-fpm关系
  10. docker安装启动mysql5.6_mysql5.6在ubuntu下的docker中安装的方法详解