2010-05-21 63 views
3

随着我的Maven项目的发展,我试图留在项目结构之上。到目前为止,我有一个2-3级的嵌套目录布局,每个级别都有一个POM,其中module条目对应于该级别的目录。 POM继承(parent属性)不一定遵循这一点,并且与此问题的目的不相关。在Maven项目中,嵌套或平面目录布局的原因是什么?

现在,虽然嵌套结构对Maven来说看起来很自然,只要你在一个特定的层次上,它就很好,干净,我开始对我在IDE中看到的东西感到困惑(Eclipse和IntelliJ理念)。

我看了一下Apache Felix的源代码,他们有一个非常复杂的项目,好像是一个扁平的目录结构,所以我想知道这是否会是更好的方法。

你在实践中经历过的任何一种方法有哪些优点和缺点?

注意this question(我发现同时)似乎非常相似。我会把它留给社区来决定这是否应该作为一个副本来关闭。

回答

1

我使用了一种混合的方法。具有不同生命周期的事物(从版本和VCS的角度来看)是平坦的,具有相同生命周期的事物是嵌套的。我使用svn:externals进行结帐。我在this previous answer中写过这种方法。

+0

其他答案真的很好,谢谢。 – 2010-05-22 14:26:59

1

我投了筑巢。我使用的IDEA 9显示了项目窗格中的嵌套,因此演示文稿反映了您的逻辑项目结构。 (这不是8.1的情况 - 它已经变平了。)

我更喜欢保持东西嵌套,特别是如果名称非常相似 - 使用命令提示符时导航更容易。我有一个像myapp-layer-component这样的名称的项目,所以它们都以相同的前缀开头,而且很多都具有相同的层,因此在命令行中使用自动完成是无用的。将这些分离为嵌套结构会更容易,因为名称(应用程序名,层或组件)的每个部分在目录结构中的每个级别只重复一次。

如果从命令行构建,构建项目的子集比如构建项目更容易,如果我正在研究数据库模型,那么我经常需要构建该领域的所有项目。当文件变平时,这是非常棘手的 - 我知道的唯一方法是使用maven的-pl参数并指定要构建的项目。使用嵌套目录,我只需cddb目录并运行mvn

例如,而不是

myapp-web-gui1 
myapp-web-gui2 
myapp-web-base 
myapp-svc-clustered 
myapp-svc-clustered-integrationtest 
myapp-svc-simple 
myapp-db-model 
myapp-db-hibernate 

我们有结构

\myapp 
    \web 
    \gui1 
     pom.xml 
    \gui2 
     pom.xml (other poms omitted to keep it short) 
    \base 
    \svc 
     \clustered 
     \clustered-it 
     \simple 
    \db 
     \model 
     \hibernate  

你也可以添加嵌套集成测试,但是这似乎是驱动点太远。

筑巢,您还可以继承的所有优点(和它的一些痛苦......)

我已经受够了这个唯一的问题是,目录名称不匹配的神器ID 。 (我还在使用完整的artifactIds。)所以每个项目都必须显式定义SCM路径,因为这些路径不能再从父pom中推断出来。当然,每个目录都可以与artifactId相同,然后可以从父项中推断出SCM的详细信息,但是我发现长目录名称有点笨拙。

+0

你如何处理可能经常被编码在目录树中的多种语义, G。 Subversion中的分支/标签? – 2010-05-21 14:28:07

+0

你能举出另一个例子吗,我很无聊,我不太明白你在问什么。 – mdma 2010-05-21 14:34:41

+0

在一个大型项目中有几个层次结构,例如什么属于VCS,哪些属于一起构建,什么属于一个部署(zip等),开发人员需要在IDE中为特定任务等这些往往重叠*主要是*,但往往*不太*。随着你重用模块越多,这就越是严重,这是首先模块化的重要原因。 – 2010-05-21 15:23:18