Maven系列——答疑解惑

本博客为个人原创,转载需在明显位置注明出处

接上一篇Hello World,打开大家常见的却又好奇疑惑的pom.xml文件,我们就从这里继续讲解Maven:

Pom###


  4.0.0

  
  com.will4it
  helloworld
  1.0.0-SNAPSHOT
  jar

  
  helloworld
  http://maven.apache.org

  
  
    UTF-8
  

  
  
    
      junit
      junit
      3.8.1
      test
    
  

上一篇跟大家提过,pom文件就是Maven构建时读取的配置文件,下面咱们按xml中的序号一一来解释:

#1 groupId、artifactId、version、packaging

关于groupId、artifactId、version的含义不解释了,不明白的可以翻看上一篇文章,这3个参数可以组合成项目的唯一标识。packaging代表你要将构建目标的类型,也就是说你要打什么样的包,这里配置的是jar,同样还可以配置成war、aar、apk等。

我们在利用maven/gradle依赖某一个包时,例如v4,我们会配置成compile 'com.android.support:support-v4:23.0.0',为什么有这么长的配置?这就是v4包在Maven仓库中的唯一标识,因为仓库的唯一标识公式为:groupId:artifactId:version,明白了木有?

#2 properties

properties是干嘛的?你可以把它想象成我们Java代码中的static final常量,相当于project.build.sourceEncoding = UTF-8,我们在实际项目中的pom文件其实是有很多配置的,会涉及到很多version或者路径等等,这个时候我们就可以通过定义properties常量来代替配置中的某一个值,将这些常量集中管理,例如:#3中的dependency中的junit的version,我可以定义成3.8.1,使用的时候我们就可以用junit.version代替3.8.1

#3 dependencies

这个不用解释,大家在gradle文件中都见过,就是项目需要依赖的包的配置都在这里,只不过Maven的写法和gradle不同,但是无非还是唯一标识的三要素groupId、artifactId和version,缺一不可

关于scope,有些童鞋可能不晓得,我的理解是该dependency的作用域,scope常见的取值有compile、provided、test、system等(我知道的就这几个,想要知道全的去问度娘)。provided标识该依赖只在编译期有效,不会打进包里面,test表示只在运行测试用例时有效,compile则表示什么时候都有效,若不配置scope,默认情况下为compile。关于system,用到libs文件夹下的本地jar包时使用

Maven插件###

我们重新执行一次mvn package命令,观察一下Terminal的输出:

Maven系列——答疑解惑_第1张图片
mvn package

从日志中我们可以发现,Maven构建时操作的顺序是:

  1. 下载依赖的junit-3.8.1的jar包等相关文件
  2. 运行maven-resources-plugin:2.6
  3. 运行maven-compiler-plugin:3.1
  4. 下载3中compiler插件需要的junit-3.8.2的相关文件
  5. ......

首先Maven会检查pom文件中的所有dependency是不是已经全部下载完成,下载完成的标准是本地仓库中是否有所有依赖的文件,之前给大家提过的本地仓库的存储路径是遵循一定规律的,这个路径就是.m2/repository/groupId/artifactId/version/,对的,还是三要素的唯一标识组成的。

所有依赖下载完成之后,就开始运行一个个的plugin插件,这是一个新概念,解释一下:我们可以把Maven看成是一个工厂,在整个构建过程中,负责主要工作的其实是工厂内部的一台台机器,每台机器对应的就是plugin插件。肯定有人会有疑问,pom文件里面并没有plugin的配置啊,Maven怎么知道要运行哪些插件?对的,这又要提到另一个概念了,pom文件也是有继承关系的,所有的pom文件默认都会继承Maven的super-pom文件,这个super-pom文件定义了构建过程中需要执行的plugin,如果你的项目有特殊需要,可以在子pom,也就是你项目中的pom文件中添加,这么说应该没问题了吧。而且在实际项目中,我们肯定会有很多子项目,比如说一个Android Studio工程中我们会有多个module,那我们可以把公共的配置定义在workspace的父pom文件中,每个module中的pom都继承这个父pom,然后再根据各自module的需要添加各自的配置,下一篇文章我们会接触到,到时候再聊。

我们看到在运行compiler插件的时候,还会下载junit-3.8.2的相关文件,这是因为本身compiler插件也是有他自己的dependency,也就是说compiler插件依赖的是junit-3.8.2,想要运行compiler插件,就得先把插件的所有依赖全部下载完成,这也是为什么你第一次执行mvn命令,需要下载一大堆文件的原因。

如果你足够细心的话,你可能还会有这样的疑问,我依赖的dependency也会有它的dependency,比如说junit就有它自己的dependency,而这个dependency还会有dependency,可以我在项目中只配置了junit这一项,这是怎么回事?记住一件事,你只需要管好自己就行,因为Maven的依赖时传递的,仔细查一下Terminal日志中的downloading,你会发现不止是下载了junit的jar包,还下载了它的的pom文件,Maven就是通过这样的机制来下载所有的依赖文件,肚油懂了不?

还有一些概念###

关于Maven的概念还有很多,想要纠结细节的有点没完没了了,我觉得这三篇文章已经涵盖了Maven的核心概念,掌握了这些你完全可以构建你自己的Android项目。好吧,我说实话,其实我也就理解这么多,其他一些如生命周期、goal等概念我接触的不多,理解的也不够透彻,讲也讲不清楚,这些就留着大家在实际项目操作中慢慢接触体会吧。还剩最后一篇文章,带大家用Maven构建一个简单的Android项目,敬请期待!

参考文章:http://www.oracle.com/technetwork/cn/community/java/apache-maven-getting-started-2-405568-zhs.html

你可能感兴趣的:(Maven系列——答疑解惑)