maven的坐标
Maven的坐标是用来唯一标识一个文件(例如jar包)的位置,类似于URL地址。由以下几个部分组成:
groupId:用于标识一个项目。
例如:某公司ikantalk.cn有一个crmx2项目。则可以这样命名名:cn.ikantalk.crmx2
artifactId:用于标识项目下的模块。
例如:crmx2项目下模块分为:core,common,model,web等。则artifactId分别为:core,common,model,web。
但通常artifactId只写core,common,model查找不是很方便,因为其它项目也有可能会有core,common等模块,导致不好区别。
所以一般都会以项目名做为前缀:crmx2-core,crmx2-common,crmx2-model,crmx2-web等。
这样,只看模块名,就能区别是哪个项目的哪个模块了。
version:版本号
这个不用多介绍,0.1.0,2.0.0等。
name: 模块的名字
执行mvn命令时,会显示在输出中。
packaging:打包方式
如果不指定,则默认值是jar。
根据项目性质的不同,可选择的值有:war,pom等。
打包成的文件名:crm-core-0.1.0.jar,crm-web-2.0.0.war等。
Maven的聚合
如果项目只有一个模块,谈聚合没有什么意义。
多个项目模块
crmx2下有两个项目模块,分别是comm和core。相应的pom.xml如下:
<project>
<groupId>cn.ikantalk.crmx2</groupId>
<artifactId>crmx2-comm</artifactId>
<version>1.0.0</version>
<name>CRM Comm Module</name>
<packaging>jar</packaging>
<dependencies>
......
</dependencies>
</project>
<project>
<groupId>cn.ikantalk.crmx2</groupId>
<artifactId>crmx2-core</artifactId>
<version>1.0.0</version>
<name>CRM Comm Module</name>
<packaging>jar</packaging>
<dependencies>
......
</dependencies>
</project>
这两个模块,每次构建时,都要在各自的目录中执行mvn命令。
两个模块还好,但是有4个,5个,甚至更多模块时,一次全部构建,也是很花时间的,而且是低效率的重复工作。
如何能一次就构建多个项目,有没有更有效率的办法呢?
多项目模块的聚合
为了能一次构建两个(或多个)模块,就需要再创建一个pom.xml来对多个模块进行集中的操作,也就是聚合。
新建一个用于聚合的pom.xml
<project>
<groupId>cn.ikantalk.crmx2</groupId>
<artifactId>crmx2-all</artifactId>
<version>1.0.0</version>
<name> Build All Modules</name>
<packaging>pom</packaging>
<modules>
<module>....</module>
......
</modules>
</project>
注意:
1. 此pom.xml的packaging元素的值为:pom。
2. 使用了元素modules和module,module的值根据目录结构的不同,会有所区别。
聚合的目录结构
聚合的目录结构可分为:父子结构和平行结构,这是由聚合pom.xml的位置的不同而决定的。
父子结构
聚合pom.xml与项目模块crmx2-core,crmx2-comm目录平级,聚合pom.xml所在的build-all目录,也包括所有项目模块目录。
|_build-all
|_pom.xml
|_crmx2-core
|_pom.xml
|_crmx2-comm
|_pom.xml
此时,聚合pom.xml中的module定义如下:
<modules>
<module>crmx2-core</module>
<module>crmx2-comm</module>
</modules>
平行结构
聚合pom.xml**所在的bulid-all目录**与crmx2-core,crmx2-comm目录平级。
|_build-all
|_pom.xml
|_crmx2-core
|_pom.xml
|_crmx2-comm
|_pom.xml
此时,聚合pom.xml中的module定义如下:
<modules>
<module>../crmx2-core</module>
<module>../crmx2-comm</module>
</modules>
注意:module的值是模块的相对路径名,所以在使用不同的目录结构时,值会不同。