- 浏览: 434281 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (377)
- Java (66)
- C++ (0)
- VC++ (0)
- .net (1)
- css (36)
- 数据库 (22)
- html (2)
- extjs (1)
- jpbm (0)
- javascript (31)
- 物资管理 (1)
- java基础 (5)
- C# (0)
- Android (56)
- window service (1)
- 其他 (2)
- Web服务器 (7)
- jbpm (1)
- eclipse (2)
- tomcat (3)
- java字符串与二进制的相互转化 (1)
- Oracle 数据库 (6)
- FreeMarker (8)
- 浏览器 (1)
- php (1)
- photoshop (6)
- spring (4)
- spring mvc (2)
- Acegi (1)
- webStorm 3.0 (4)
- Mongodb (8)
- mysql (9)
- 软件开发:需求分析 (1)
- 把Java程序作为Windows系统服务 (1)
- nodejs (4)
- json (1)
- 缓存 (1)
- J2ee (2)
- Flash报表 (1)
- MyEclipse+Maven+Tomcat (11)
- 生活 (1)
- Ubuntu (1)
- Bootstrap (1)
- jquery easy ui (2)
- 敏捷开发 (1)
- phone gap (1)
- rest (1)
- 移动开发 (22)
- Redis + Jedis + Spring (3)
- anroid (7)
- grunt 教程 (7)
- PhoneGap (2)
- sublime text (7)
- mariadb (1)
- linux (1)
- maven (2)
- jquery (1)
- ActiveMQ (1)
- LVS Nginx (1)
- nginx (6)
- ngnix (1)
- 爱因斯坦 (1)
- 天干地支 (1)
最新评论
-
muqingren:
...
Maven多模块布局实例详解 -
shutear:
解决了我的难题,谢谢分享!
Unable to load configuration. - action - file:/D:/studytool/apache-tomcat-6.0.16 -
702346318:
[img][/img][flash=200,200][/fla ...
CAS单点登录完整教程(上)【转】 -
liuguofeng:
PersonS631887934 写道学习中。。 有个问题想请 ...
js constructor属性 -
S631887934:
学习中。。 有个问题想请教楼主为什么要加上Person.pro ...
js constructor属性
一、开场白
使用Maven有段时间了,只能感慨真是个好东西,让我从传统模式体会到了严谨、规范、敏捷、方便的特性。如果你懂Maven或许看过Juven翻译的《Maven权威指南》;发个牢骚:由于Maven的出身问题导致学习曲线陡峭,所有有些人就开始说Maven不好用;原因有二:一是排斥Maven,二是没有耐心和精下心来学习,引用老毛的话来提醒我说的那些人:
没有调查就没有发言权
到了Maven这里就是(适用于技术方面):
没有深入学习也没有发言权
如果Maven不好那么Spring、Hibernate这些大家经常使用的框架为什么还是从ant转移到Maven?如果Maven不好那么为什么国外大多数项目都在使用Maven呢?原因自己考虑,我不废话!我的这些话就是告诫那些信口雌黄的人。
二、多模块布局概述
详细属性Maven的童鞋们都看过《Maven权威指南》,里面也讲解如何搭建多模块的Maven项目,但是那个毕竟是比较简单的,在实际应用中就有点水土不服了;后来又参考了Juven的一篇《Maven最佳实践:划分模块》博文,相对权威指南来说介绍的比较详细了,但是这还是不能满足我真正在企业应用的需求,等你看完Juven的博文后再看看下面这个实际应用中的项目布局有什么异同:
OK,现在应该看出来有什么不同了,我的项目结构比权威指南里面的介绍复杂、比Juven的那篇文章说的也复杂,接下来再看看这张图片:
<!--more-->上面这张图片是我在写这篇文章的时候刚刚找到的:《按需构建多模块,玩转Maven反应堆》,和上面的Maven多模块布局概图对比一下是不是基本一样?真是后悔当初怎么没有看到Juven的这篇文章,后来把hibernate的项目checkout下来分析他的maven多模块结构布局然后再结合实际应用得出的Maven多模块布局概图。 OK,现在你对多模块布局有了初步的印象了,接下来才是重点,逐个击破、逐个分析。
三、多模块布局详解
无图无真相,有图才给力:(如果想真正了解多模块那么请先看着图片和说明揣摩一下含义……)
声明:由于是本例是根据实际应用的项目来分析的,所以会比之前说的教程和Juven的文章实例复杂一些。
-
denong-pb:先看实例pom.xml:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<?
XML:NAMESPACE
PREFIX = [default] http://maven.apache.org/POM/4.0.0
NS
=
"http://maven.apache.org/POM/4.0.0"
/><
project
xmlns
=
"http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation
=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
>
<
modelVersion
>4.0.0</
modelVersion
>
<
groupId
>com.wsria</
groupId
>
<
artifactId
>dn-pb</
artifactId
>
<
version
>1.0.5-SNAPSHOT</
version
>
<
name
>Denong Point Bank</
name
>
<
packaging
>pom</
packaging
>
<!-- 设定团队持续集成发布包服务器 -->
<
distributionManagement
>
<
repository
>
<
id
>nexus</
id
>
<
name
>Team Nexus Release Repository</
name
>
</
repository
>
<
snapshotRepository
>
<
id
>nexus</
id
>
<
name
>Team Nexus Snapshot Repository</
name
>
<
uniqueVersion
>false</
uniqueVersion
>
</
snapshotRepository
>
</
distributionManagement
>
<
scm
>
</
scm
>
<
modules
>
<
module
>parent</
module
>
<
module
>common</
module
>
<
module
>entity</
module
>
<
module
>data</
module
>
<
module
>dao</
module
>
<
module
>service</
module
>
<
module
>web-parent</
module
>
<
module
>web-admin</
module
>
<
module
>web-site</
module
>
</
modules
>
<
build
>
<
defaultGoal
>install</
defaultGoal
>
<
plugins
>
<
plugin
>
<
groupId
>org.apache.maven.plugins</
groupId
>
<
artifactId
>maven-release-plugin</
artifactId
>
<
version
>2.0-beta-9</
version
>
<
configuration
>
<
autoVersionSubmodules
>true</
autoVersionSubmodules
>
</
configuration
>
</
plugin
>
</
plugins
>
</
build
>
</
project
>
- bin:可有可无,存放一些maven的命令批处理文件或者快捷bat文件,比如本地install项目或者打包根据产品profile(在模块中配置id为product的profile)打包war;
- common:估计有一些经验的人都会把一些常用的工具类封装起来,由经验丰富的人来维护到common模块中作为技术沉淀和公司的公共类库,方便大家快速开发使用。当然实际应用中可能会使用公司已经存在的common模块,然后单个项目中可能会再加入一个common模块,一般公司的common包都是这么积累下来的;
- dao:每个模块的数据存取类,因为本项目是根据springside基础上构建的,所以都是继承HibernateDao,如果涉及到大数据量或者存储过程的调用会再加入相应的*JdbcDao;
- data: ,根据上图介绍一下:除了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插件,集成单点登录功能
四、模块之间依赖关系
五、和SVN的整合——maven-release-plugin
maven-release-plugin是经常使用的插件,这里简单介绍一下,要点:
-
每个模块的scm配置:
1234
<
SCM
>
</
SCM
>
上面的scm配置在每一个模块中存在,因为每一个模块再svn目录中有单独的目录;
但是parent模块有点不同,因为除了parent模块其他子模块需要继承parent,如下代码:1234567<
PARENT
>
<
GROUPID
>com.wsria</
GROUPID
>
<
ARTIFACTID
>parent</
ARTIFACTID
>
<
VERSION
>1.0.5-SNAPSHOT</
VERSION
>
<
RELATIVEPATH
>../parent/pom.xml</
RELATIVEPATH
>
</
PARENT
>
<
ARTIFACTID
>dn-pb-entity</
ARTIFACTID
>
1234567891011<!-- release插件 -->
<
PLUGIN
>
<
GROUPID
>org.apache.maven.plugins</
GROUPID
>
<
ARTIFACTID
>maven-release-plugin</
ARTIFACTID
>
<
VERSION
>2.0-beta-9</
VERSION
>
<
CONFIGURATION
>
<
USERNAME
>${svn.name}</
USERNAME
>
<
PASSWORD
>${svn.pwd}</
PASSWORD
>
</
CONFIGURATION
>
</
PLUGIN
>
12345678910111213<
SETTINGS
>
...
<
PROFILES
>
<
PROFILE
>
<
ID
>denong-product</
ID
>
<
PROPERTIES
>
<
SVN.NAME
>kafeitu</
SVN.NAME
>
<
SVN.PWD
>123456</
SVN.PWD
>
</
PROPERTIES
>
</
PROFILE
>
</
PROFILES
>
...
</
SETTINGS
>
D:\wsria\projects\denong\denong-pb>mvn release:prepare -Pdenong-product
在svn中自动打的tag结构为: 接下来就可以执行命令:D:\wsria\projects\denong\denong-pb>mvn release:perform
六、多模块布局问题
如果你够细心可能发现了上面出现了relativePath属性,这个再多模块的配置中经常遇到的问题,根据目前的案例来说子模块和parent是同级的目录,但是每个子模块又都需要继承parent模块的一些配置,比如上面介绍的到common模块会使用如下配置:
1
2
3
4
5
6
|
< 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继承配置:
1
2
3
4
5
6
7
|
< 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
发表评论
-
手动把jar导入maven
2012-05-10 22:53 1049mvn install:install-file -Dfile ... -
Maven-repository 汇总
2012-05-09 12:03 3345查看文章 Maven ... -
JA-SIG(CAS)学习笔记1
2012-05-08 16:28 1367技术背景知识: JA-SIG ... -
CAS单点登录完整教程(上)【转】
2012-05-08 16:26 2993一、教程前言 教程目的:从头到尾细细道来单点登录服务器 ... -
源代码解读Cas实现单点登出(single sign out)功能实现原理
2012-05-08 16:16 1277关于Cas实现单点登入(single sing on)功能的文 ... -
使用 CAS 在 Tomcat 中实现单点登录
2012-05-08 16:14 1183CAS 介绍 CAS 是 Yale 大学发起的一个开源项 ... -
Maven2部署构件到Nexus时出现的Failed to transfer file错误
2012-05-07 15:13 1043转载地址http://www.javatang.com/a ... -
Eclipse is running in a JRE, but a JDK is required
2012-05-03 22:22 1028clipse is running in a JRE, but ... -
在myeclipse下安装maven插件
2012-04-28 10:00 2263MyEclipse 6.5安装 打开Help-> ... -
MyEclipse+Maven+Tomcat集成
2012-04-27 16:30 2902本文用来介绍如何将MyEclipse和Maven、Tomcat ...
相关推荐
利用matlab对am,dsb,ssb,ask,fsk,bpsk信号进行正交调制解调仿真,并在不同信噪比条件下对其数字信号进行了误码率的计算。.rar
任务悬赏活动,带分销返佣
行业分析报告
2024年中国控制膨胀合金箔行业研究报告
本项目是基于Java的Servlet和JSP的404错误处理设计源码,包含46个文件,其中主要包含18个jsp页面文件,12个xml配置文件等。系统采用了Java编程语言,实现了基于Servlet和JSP的404错误处理功能。项目结构清晰,代码可读性强,易于理解和维护。
java练习题
行业分析报告
GTM模式在华为产品营销中的应用glz.pptx
GUI API包含的类分为三个部分:组件类(component class) 容器类(container class),和辅助类(helper class) 1. 组件类是用来创建用户图形界面的,例如JButton,JLabel,JTextField. 2. 容器类是用来包含其他组件的,例如JFrame,JPanel 3. 辅助类是用来支持GUI组件的,例如Color,Font
1、嵌入式物联网ESP32项目实战开发。例程经过精心编写,简单好用。 2、代码使用Visual Studio Code + ESP-IDF开发,C语言编程。例程在ESP32-S3上运行。若在其他型号上运行,请自行调整。 3、如果接入其他传感器,请查看发布的其他资料。 4、ESP32与模块的接线,在代码当中均有定义,请自行对照。 5、若硬件差异,请根据自身情况适当调整代码,程序仅供参考。 6、代码有注释说明,请耐心阅读。 7、技术v:349014857;
六数码问题解决方法 可类比到八数码 一个小小的六数码问题求
引言 年度工作回顾 系统进展与亮点 技术创新与应用 市场反馈与用户评价 存在问题与挑战 未来展望与计划 结束语与感谢 一、引言 简要介绍智能家居系统的重要性和发展趋势 回顾本年度的工作目标和重点 二、年度工作回顾 系统建设与维护 完成的项目与里程碑 系统稳定性与可靠性提升 团队建设与培训 团队成员构成与职责 培训与技能提升活动 合作伙伴与资源整合 与供应商、合作伙伴的合作情况 资源整合与利用 三、系统进展与亮点 功能扩展与优化 新增功能介绍与效果评估 现有功能的优化与改进 用户体验提升 界面设计与交互优化 用户反馈与改进措施 四、技术创新与应用 物联网技术的应用 传感器与通信技术的升级 大数据分析与应用 智能家居的智能化管理 自动化控制与节能策略 安全防护与预警系统 五、市场反馈与用户评价 市场反馈分析 市场需求与竞争态势 市场占有率与增长趋势 用户评价总结 用户满意度调查结果
Youtube Video Player+Youtube API Unity播放YouTube视频插件包unitypackage 支持Unity版本2019.4.40或更高 在您的游戏或项目中播放 YouTube 视频。适用于台式机、控制台和移动设备。您可以在任意位置播放 YouTube 视频。 描述 9 年提供在 Unity 项目中播放 YouTube 视频的解决方案。 现在支持字幕您可以搜索视频、频道、获取视频缩略图和有关视频的信息。您可以从YouTube API获取所有视频数据。 (需要添加自己的api,包含教程)。 使用 Unity 视频播放器或自定义播放器播放 YouTube 视频。 我们支持直播视频,但此功能不适用于 Unity 视频播放器,您需要一个支持 HLS 的视频播放器。
行业分析报告
通信原理通信课后答案02.doc
本项目是基于JavaScript的小区物业管理系统设计源码,包含319个文件,其中主要包含81个js脚本文件,71个jsp页面文件,66个java源代码文件等。系统采用了JavaScript、Java和CSS技术,实现了简单的小区物业管理系统。项目结构清晰,代码可读性强,易于理解和维护。
时间序列预测的informer模型python代码分享
tomcat10安装包(含windows和linux版本).zip
行业分析报告
电子通信设计资料笔记本电脑的智能底座设计论文及其资料提取方式是百度网盘分享地址