1、项目结构java
pom.xml src main java resources test java resources target classes
2、maven的scopemysql
compile(默认)=>在编译和单元测试会使用,而且会被一块儿打包。web
test=>仅仅在单元测试使用spring
如junit,这些只须要test时候,在package时不使用,也没有必要打包到war中,此时须要声明scope为test
sql
runtimeapi
如mysql.jar等jdbc的驱动,在test和compile时是不须要的,只有在运行时才会须要,
服务器
providedmaven
如servlet-api.jar 在test和compile是须要的,可是打成war包,不须要,通常web服务器都自带有该jar。可能会形成版本冲突
ide
import单元测试
system
3、maven的依赖传递性
A -> J1-1.0.jar
A -> E -> J2-1.0.jar
B -> J1-2.0.jar
B -> J2-2.0.jar
注意:C -> A,B ===> 此时 C依赖A,B的全部compile级别的jar,不会依赖test。 即在AB中声明的junit若是scope是test,则不会被传递
注意:对J,C会依赖A的版本仍是B的版本。首先Maven是没法识别版本的高低,因此,不会想固然的依赖高版本。
1.先声明,先依赖原则
若是C的pom文件中,先定义dependency是A,则J1-1.0.jar会被依赖。
2.路径短原则
C会依赖J2-2.0.jar,由于C->B->J2-2.0.jar依赖路径短于 C->A->E->J2-1.0.jar
3.可使用排除
假设C的pom文件中,确实是dependency是A,则J1-1.0.jar会被依赖,可是此时C就是要依赖B的J1-2.0.jar版本,此时可使用exclusions 排除A中的J1.jar ==> 注意不用声明version,由于A中只可能拥有一个version的J1.jar
4、maven的聚合
三个模块,A,B,C 关系以下:
A jar
B jar
C->A,B war
打包时,咱们要先打包A,再打包B,才能打包 C,由于C依赖于A,B。想象下,若是咱们有10个模块,那么咱们要操做10次。若是更多呢?
引入maven聚合的概念,目录结构以下
A
-src
-pom.xml jar
B
-src
-pom.xml jar
C
-src
-pom.xml war
D
-pom.xml pom => 新定义一个pom文件类型是pom,该pom文件中,只需定义module便可。
===> module中配置是各个子模块的相对路径 ... ... <modules> <module>../A</module> => 为模块A的路径,使用了相对路径。 编译时候,会按顺序分别操做 <module>../B</module> <module>../C</module> </modules> ... ...
5、maven继承
A-->J1-1.0.jar
B-->J1-1.0.jar
C-->J1-1.0.jar
当各个模块中均含有某些共有的jar时,如spring、common、log4j等等。
咱们能够新定义一个模块,做为全部模块的父模块。全部这些配置均在该新模块中配置。各个子模块只需继承就行了。
引入maven继承的概念,目录结构以下
A
-src
-pom.xml jar
=>修改次pom,添加继承关系
继承中relativepath 是 父模块的pom.xml文件的路径 ... <parent> <groupid></groupid> <artifactid></artifactid> <version></version> <relativepath>../E/pom.xml</relativepath> => 继承E模块的pom.xml </parent> ...
B
-src
-pom.xml jar
... <parent> <groupid></groupid> <artifactid></artifactid> <version></version> <relativepath>../E/pom.xml</relativepath> => 继承E模块的pom.xml </parent> ...
C
-src
-pom.xml war
... <parent> <groupid></groupid> <artifactid></artifactid> <version></version> <relativepath>../E/pom.xml</relativepath> => 继承E模块的pom.xml </parent> ...
D
-pom.xml pom => 新定义一个pom文件类型是pom,该pom文件中,只需定义module便可。
E
-pom.xml pom => 把全部共有的属性都移到此pom中,如属性,dependency,groupid...全部子模块都能被继承。 子类能够从新定义覆盖。
问题:
因为dependency。对于不一样的模块,依赖是不同的,若是把各个模块全部的dependency都移到parent中的话,会致使全部的模块都依赖的全部jar。
引入dependencymanager概念。即在parent中定义dependencymanager,并添加全部子类须要的jar。以及版本,
此时子类是不会继承这些jar的,必须收到写入dependency。可是不须要指定version。由于会自动查找父类dependencymanager中的version,此处version确定是惟一的。
6、聚合与继承合并
能够把聚合的配置直接写入到继承中。
7、
也能够不建立父模块。而直接copy pom.xml到各个模块的根目录下。这样只须要修改module和relativepath便可
8、版本管理
version: 通常为 a.b.c-里程碑.jar
a:通常为大版本,如java5.0 --> java6.0 , struts1.0 -> struts2.0 都是变化大的版本迭代。大调整的版本
b:通常为分支版本,
c:分支版本有
里程碑:snapshot(开发版本) --> alpha(项目内测试的版本) --> beta(使用一段时间后) --> release --> ga版本