1 简单的核心概念
1.1 坐标
groupId、artifactId、version,很简单,这三个坐标定位到了该依赖的位置,有了它们就可以下载该依赖了。
1.2 依赖
如果一个jar包使用了另外一个jar包中的类,那么就说该jar包依赖另外一个jar包。
1.3 仓库
jar包放在仓库中,方便共享。
2 难的核心概念
2.1 生命周期
同一套生命周期的各个阶段之间是有相互依赖关系的,后面的阶段会依赖前面的阶段,也就是说,调用后面的阶段的时候会触发前面阶段的插件的执行。
比如maven test会触发它前面的validate、initialize、compile的执行。
触发生命周期阶段的执行本质上是触发该阶段对应的插件的执行。
2.1.1 生命周期和插件之间的关系
生命周期的工作是插件完成的,生命周期和插件协同工作,密不可分。
2.2 三套生命周期
每套生命周期之间是相互独立的,触发某套生命周期的时候不会对其它套生命产生影响。
2.2.1 clean生命周期
pre-clean->clean->post-clean
2.2.2 default生命周期
validate->initialize->compile->test->package->verify->install->deploy
2.2.3 site生命周期
这套生命周期可以不管。
生命周期是抽象的,具体的工作是由相应的插件完成的。
2.2 插件
2.2.1 常用的插件
maven-shade-plugin maven-shade-plugin 只存在一个goal shade:shade,需要将其绑定到 phase package 上。
maven-compiler-plugin 编译。
maven-surefire-plugin 执行测试用例的插件。
protobuf-maven-plugin 默认绑定到generate-sources阶段,compiles main .proto definitions into Java files and attaches the generated Java sources to the project,所以,在java代码中可以访问到这些生成的java代码,这是如何做到的?
2.2.2 插件绑定
本质上是maven的生命周期的阶段和插件的目标相互绑定,用以完成实际的构建任务。
2.2.3 插件所绑定的生命周期
maven-compiler-plugin:compile <--> compile
maven-compiler-plugin:testCompile<-->test-compile
maven-surefire-plugin:test <--> test
maven-shade-plugin:shade<-->package
2.2.4 插件的目标
每个插件有多个目标,每个目标对应一个功能。
冒号前面是插件前缀,后面是插件目标。
2.2.5 一个生命周期对应一个插件目标
如果没有指定<phase>
,那么就会绑定到插件默认的生命周期阶段上。如果插件没有默认生命周期阶段,那么插件目标将不会被执行。
当多个插件目标绑定到同一生命周期阶段的时候、顺序是按照插件声明的顺序来决定目标的执行顺序。
如果一个生命周期阶段有默认的插件目标,现在又设置了一个插件目标,那么设置的插件目标会覆盖默认的插件目标吗?
暂时认为是覆盖的。
2.3 继承和聚合
这个暂放。
3 各个插件参考资料
http://maven.apache.org/plugins/maven-compiler-plugin/index.html