在多项目构建中似乎有几种方法来构建父pom,我想知道是否有人对每种方式的优点/缺点有任何想法.
拥有父pom的最简单方法是将它放在项目的根目录中,即
myproject/
myproject-core/
myproject-api/
myproject-app/
pom.xml
Run Code Online (Sandbox Code Playgroud)
其中pom.xml既是父项目又是-core -api和-app模块
下一个方法是将父项分离到它自己的子目录中,如中所示
myproject/
mypoject-parent/
pom.xml
myproject-core/
myproject-api/
myproject-app/
Run Code Online (Sandbox Code Playgroud)
父pom仍然包含模块,但它们是相对的,例如../myproject-core
最后,有一个选项,模块定义和父项分开,如
myproject/
mypoject-parent/
pom.xml
myproject-core/
myproject-api/
myproject-app/
pom.xml
Run Code Online (Sandbox Code Playgroud)
父pom包含任何"共享"配置(dependencyManagement,属性等),myproject/pom.xml包含模块列表.
目的是可扩展到大规模构建,因此应该可以扩展到大量项目和工件.
一些奖金问题:
编辑:每个子项目都有自己的pom.xml,我把它留了下来以保持简洁.
我一直在阅读有关Maven反应堆的内容,并对其术语用法感到困惑.我读过一个多模块是一个反应堆,你可以操纵maven反应堆,反应堆是一个插件.究竟什么是反应堆?
我有一个像这样的maven项目基础设施:
/trunk/all/pom.xml
/trunk/all/libs/lib1/pom.xml
/lib2/pom.xml
...
/trunk/all/projects/p1/pom.xml
/p2/pom.xml
...
Run Code Online (Sandbox Code Playgroud)
你看,我有很多库和许多使用这些库的项目.
所有这些都结合到一个多模块项目中,因为我喜欢
mvn test在完成一些全局重构之后,只做一个单独的编译和测试我的所有代码.目前,我的所有模块都是版本1.0-SNAPSHOT.
现在我想发布项目,p2并且所有库都p2使用(例如lib1和lib2)版本1.0.从那以后,我做了一些修改代码lib1,但没有上lib2.
我希望下一个版本p2是版本1.1,lib1在版本中使用1.1(它自上一版本以来已被修改),但lib2仍然在版本中1.0(因为它没有被修改).
更一般:如果我发布了一个版本,我想增加自上次发布以来发布项目的次要编号以及所有已更改的库.
我是否必须自己照顾所有模块版本,或者是否有能够为我完成所需工作的插件?
与'普通'svn目录结构相反,我使用以下结构:
trunk/
project1/
project2/
project3/
...
branches/
project1-branch/
project1/
project2/
...
project2-branch/
project1/
project2/
...
tags/
project1/
V1
V2
...
如您所见,我没有为每个项目单独的三元组(主干/分支/标签).
对于开发,我会检查包含我需要的所有项目的主干(有时是稀疏结账)(项目之间存在依赖关系,而某些项目只是库).
我在这里看到的好处是:
更新和签入很简单,因为我有一个所有项目的公共根目录(主干).一个简单svn update或svn commit全部.
创建标签或分支很简单,因为它只是我必须拥有的主干svn copy.(分支和标签实际上包含的项目比需要的多,但是它svn copy很便宜,如果需要,我仍然可以在分支或标签上进行稀疏检查.)
将资源从一个项目移动到另一个项目很容易,因为它们都存在于同一个存储库中.
当我正在完全检查主干时,全局重构(例如更改常用类的包)很容易,因为我可以确定我不会错过任何项目.
合并很容易,因为即使从一个项目到另一个项目的重构移动,我总是可以立即合并整个分支.
我打算迁移到maven并将所有项目从trunk转移到maven项目.我想从maven依赖管理和可用的插件中受益(现在我正在使用巨大的自定义ant文件).
现在我的问题是:
我是否必须更改svn目录结构以为每个项目提供自己的三元组(主干/分支/标签)?我猜答案是'是'.
如果我改变结构,我会松开上面提到的哪些好处(我的意思是用maven做什么会更复杂)?
用maven做同样的方法是什么?