最常用的一个使用场景是:一个父工程下面好几个子module,module之前可能会有引用关系,那么要想被引用的module在发起引用的module中被识别,需要在子module执行下面的步骤:
- mvn clean:将之前编译好的字节码清空;
- mvn compile:重新编译子模块的源码;
- mvn package:将子模块打包(jar或者war);
- mvn install:将上一步中打好的包放入本地仓库中,以便其他模块识别并引用。
需要注意的是打包的方式有三种,分别为:jar、war、pom。这三者的区别自然不用说,但是需要注意的是pom文件除了GAV(groupId, artifactId, version)是必须要配置的,另一个重要的属性就是packaging打包类型,所有的父级项目的packaging都为pom,packaging默认是jar类型,如果不作配置,maven会将该项目打成jar包。作为父级项目,还有一个重要的属性,那就是modules,通过modules标签将项目的所有子项目引用进来,在build父级项目时,会根据子模块的相互依赖关系整理一个build顺序,然后依次build。此外子类项目的packaging值只能是war或者jar,前面已经说过,packaging默认是jar类型。如果是需要部署的项目,则需要打包成war类型,如果只是内部调用或者是作服务使用,则推荐打包成jar类型。
而对于各个子项目,需要在其对应的pom文件开头申明对父级项目的引用,通过GAV实现。对于子项目自己的GAV配置,GV如果不配置,则会从父级项目的配置继承过来。子模块可通过dependencies标签来添加自己的依赖。如果一个需要继承父工程中引用的jar,那么需要在父工程中将这些需要继承给子module的依赖放在dependencyManagement中,在子module的pom文件中业务要声明相应的依赖,但是不需要声明版本号。
如下面的例子:
在父工程中的pom文件中声明了javax.servlet-api的引用,并且是在dependencyManagement标签中声明的,所以这个依赖可以由子模块继承,在module的pom文件中添加下面的引用即可,不需要声明版本号。