首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Maven多模块格局实例详解

2012-07-30 
Maven多模块布局实例详解OK,现在应该看出来有什么不同了,我的项目结构比权威指南里面的介绍复杂、比Juven的

Maven多模块布局实例详解

OK,现在应该看出来有什么不同了,我的项目结构比权威指南里面的介绍复杂、比Juven的那篇文章说的也复杂,接下来再看看这张图片:

Maven多模块格局实例详解

<!--more-->

上面这张图片是我在写这篇文章的时候刚刚找到的:《按需构建多模块,玩转Maven反应堆》,和上面的Maven多模块布局概图对比一下是不是基本一样?真是后悔当初怎么没有看到Juven的这篇文章,后来把hibernate的项目checkout下来分析他的maven多模块结构布局然后再结合实际应用得出的Maven多模块布局概图。 OK,现在你对多模块布局有了初步的印象了,接下来才是重点,逐个击破、逐个分析。

三、多模块布局详解

无图无真相,有图才给力:(如果想真正了解多模块那么请先看着图片和说明揣摩一下含义……)

Maven多模块格局实例详解

声明:由于是本例是根据实际应用的项目来分析的,所以会比之前说的教程和Juven的文章实例复杂一些。

    denong-pb:先看实例pom.xml: ,根据上图介绍一下:除了data目录外其他的配置文件都是在测试期间使用的,根据不同需求使用不同配置文件,例如一些不需要spring启动时初始化的数据使用applicationContext-test-no-init-sql.xml,这个没有什么规定,根据项目来设置;data目录是存放一些使用dbunit导出的xml数据文件,作用是在单元测试时的数据初始化或者利用数据文件初始化指定的数据库,一般这些数据文件的类型包括:数据字典、系统配置参数等 entity:这里说一下JPA注解的实体工具,开始我使用的是eclipse3.6的JPA工具,但是发现有些属性加不上@Column注解很是郁闷,只能手动加入;当然你也可以使用springside中提供的hibernatetools模板生成,但是我还是希望在生成期间能完全受控,所以最好想到了MyEclipse,配置好数据源然后从数据库中逆向生成JPA,所有字段都正确配置; parent:这里着重介绍一下,此模块是所有子模块需要继承的超级POM,举个例子容易理解:把本项目(denong-pb)当做是Java语言,那么parent模块就是Object类,此模块只负责定影其他子模块需要使用的一些公共设置,谨记:
    parent不负责管理子模块,只是被子模块集成,千万不要和denong-pb目录的pom.xml混淆
    service:就是业务处理类,供web模块调用; web-parent:供web*模块继承,例如前后台都需要调用的Action接口,像数据字典、地区信息、系统属性等 web-admin:系统的后台管理程序,使用了struts2的convention插件; web-site:系统网站部分,同样使用了struts2的convention插件,集成单点登录功能
四、模块之间依赖关系

直观教程图片最给力: Maven多模块格局实例详解

五、和SVN的整合——maven-release-plugin

maven-release-plugin是经常使用的插件,这里简单介绍一下,要点:

    每个模块的scm配置: 接下来就可以执行命令:
    D:\wsria\projects\denong\denong-pb>mvn release:perform
六、多模块布局问题

如果你够细心可能发现了上面出现了relativePath属性,这个再多模块的配置中经常遇到的问题,根据目前的案例来说子模块和parent是同级的目录,但是每个子模块又都需要继承parent模块的一些配置,比如上面介绍的到common模块会使用如下配置:

?123456<PARENT> ????<GROUPID>com.wsria</GROUPID> ????<ARTIFACTID>parent</ARTIFACTID> ????<VERSION>1.0.5-SNAPSHOT</VERSION> </PARENT> <ARTIFACTID>common</ARTIFACTID>

现在问题来了,在common模块下执行命令:mvn compile,得到的结果中包含了警告信息:

[WARNING] 'parent.relativePath' points at com.wsria:dn-pb instead of com.wsria:dn-pb-parent, please verify your project structure @ line 4, column 10

意思是找不到dn-pb-parent这个模块……因为maven不知道dn-pb-parent模块存在的位置才会导致警告信息的出现,解决办法是手动指定dn-pb-parent模块的位置,所以最终的解决办法是在parent标签中加入:

?1<RELATIVEPATH>../parent/pom.xml</RELATIVEPATH>

这样maven就知道继承的parent的具体位置了,

relativePath默认值为../pom.xml,参考:http://maven.apache.org/ref/3.0/maven-model/maven.html

完整的parent继承配置:

?1234567<PARENT> ????<GROUPID>com.wsria</GROUPID> ????<ARTIFACTID>dn-pb-parent</ARTIFACTID> ????<VERSION>1.0.5-SNAPSHOT</VERSION> ????<RELATIVEPATH>../parent/pom.xml</RELATIVEPATH> </PARENT> <ARTIFACTID>dn-pb-common</ARTIFACTID>

现在运行mvn命令一切正常了;

记得每一个继承parent模块的子模块都需要添加relativePath设置
七、多模块开发期间Debug

一般我们在开发web模块的时候会启用tomcat或者jboss的debug模式来断点调试应用,但是你会发现如果web模块依赖了service模块想进入service模块debug但是eclipse却告诉你找不到class的源码,解决办法:

把service模块加入到Build Path的Project列表中
八、其他方案

如何布局是根据每一个项目组的安排定义的,比如

    一个项目组分模块开发的话或许不像本例一样分模块而是把每一层都集中在一个项目中 或许web模块单独一个子模块,其他的entyty、dao、service集中在一个子模块model中
怎么布局需要根据项目实际情况来定义,当然要考虑到单个子模块的重复利用,例如service模块在本例中被web-admin和web-site模块使用,如果以后再加入webservice模块那么webservice也要依赖,或许还有命令行(command)模块也要依赖
九、结束语

这是一篇难产的文章,有些原因影响经过了3个晚上才出世,呵呵有不对的地方请留言以改正;分享这篇文章的目的就是给刚刚接触或者正需要maven多模块布局的童鞋们参考,希望能对你有帮助,谢谢关注!

?

转载http://www.kafeitu.me/2010/11/10/maven-multi-modules-designe.html

热点排行