之所以将一个项目划分成多模块,其好处是显而易见的,多模块的项目分工明确,各司其职,相互之间耦合度比较小,符合“高内聚,低耦合”。
事实上,基于Maven开发的项目一般都是多模块的。
一个简单的Maven多模块项目的结构是这样的:
---- myApp-parent
|-- pom.xml (pom)
|
|-- myApp-util
| |-- pom.xml (jar)
|
|-- myApp-dao
| |-- pom.xml (jar)
|
|-- myApp-service
| |-- pom.xml (jar)
|
|-- myApp-web
|-- pom.xml (war)
值得注意的是:父项目的打包类型是POM,也只能是POM,子项目一般是jar或者war。
下面来看下POM文件的实现细节,首先是父项目:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.myApp</groupId> <artifactId>myApp-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>myApp-util</module> <module>myApp-dao</module> <module>myApp-service</module> <module>myApp-web</module> </modules> </project>
这个父项目的packaging是pom,它不会去创建一个jar或者war,而是仅仅引用其他的maven项目的POM。这里还有一个重要的地方,就是modules节点,它显示了当前项目究竟引用了哪些子项目。
然后看下myApp-util模块的pom配置:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <artifactId>myApp-util</artifactId> <groupId>com.myapp.util</groupId> <name>myApp-util</name> <version>1.0.0</version> <packaging>jar</packaging> <modelVersion>4.0.0</modelVersion> <parent> <span style="color:#FF0000;"><strong><artifactId>myApp-parent</artifactId> <groupId>com.myApp</groupId> <version>0.0.1-SNAPSHOT</version></strong></span> <relativePath>..</relativePath> </parent> </project>
在上述配置中,通过 <parent>节点来继承父项目,继承是通过Maven坐标GAV实现的(红色加粗部分。)其他模块的pom配置就省略了,它们基本上与myApp-util的配置是类似的,值得注意的是:模块之间的引用时也是通过maven坐标来实现的,比如:myApp-service 模块依赖myApp-dao 模块,其配置如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <artifactId>myApp-service</artifactId> <groupId>com.myapp.service</groupId> <name>myApp-model</name> <version>1.0.0</version> <packaging>jar</packaging> <modelVersion>4.0.0</modelVersion> <parent> <artifactId>myApp-parent</artifactId> <groupId>com.myApp</groupId> <version>0.0.1-SNAPSHOT</version> <relativePath>..</relativePath> </parent> <strong><dependencies> <dependency> <artifactId>myApp-dao</artifactId> <groupId>com.myapp.dao</groupId> <version>1.0.0</version> </dependency> </dependencies></strong> </project>
最后让我们看下maven是如何build真个项目的:[INFO] [INFO] --- maven-war-plugin:2.1.1:war (default-war) @ myApp-web --- [INFO] Packaging webapp [INFO] Assembling webapp [myApp-web] in [D:\eclipseworkspace\myApp-parent\myApp-web\target\myApp-web-0.0.1-SNAPSHOT] [INFO] Processing war project [INFO] Copying webapp resources [D:\eclipseworkspace\myApp-parent\myApp-web\src\main\webapp] [INFO] Webapp assembled in [27 msecs] [INFO] Building war: D:\eclipseworkspace\myApp-parent\myApp-web\target\myApp-web-0.0.1-SNAPSHOT.war [WARNING] Warning: selected war files include a WEB-INF/web.xml which will be ignored (webxml attribute is missing from war task, or ignoreWebxml attribute is specified as 'true') [INFO] [INFO] --- maven-install-plugin:2.3.1:install (default-install) @ myApp-web --- [INFO] Installing D:\eclipseworkspace\myApp-parent\myApp-web\target\<strong>myApp-web-0.0.1-SNAPSHOT.war</strong> to D:\mvnrepo\com\myapp\web\myApp-web\0.0.1-SNAPSHOT\myApp-web-0.0.1-SNAPSHOT.war [INFO] Installing D:\eclipseworkspace\myApp-parent\myApp-web\pom.xml to D:\mvnrepo\com\myapp\web\myApp-web\0.0.1-SNAPSHOT\myApp-web-0.0.1-SNAPSHOT.pom [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] myApp-parent ...................................... SUCCESS [0.201s] [INFO] myApp-util ........................................ SUCCESS [0.667s] [INFO] myApp-dao ......................................... SUCCESS [0.214s] [INFO] myApp-service ..................................... SUCCESS [0.225s] [INFO] myApp-web ......................................... SUCCESS [0.418s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.830s [INFO] Finished at: Thu Dec 25 11:37:01 CST 2014 [INFO] Final Memory: 7M/18M [INFO] ------------------------------------------------------------------------