构建允许在不同二进制文件之间共享模块的系统

时间:2009-12-14 05:48:20

标签: java maven-2 build buildr

我正在尝试选择最合适的构建系统,以便在企业中使用公共源存储库,强调共享公共代码。我希望源层次结构看起来像这样:

 - src
   - java
     - common
       - net
       - database
     - team1
     - team2
     - team3
       - lib
 - tests
   - java
     - common
       - net
       - database
     - team1
     - team2
     - team3
       - lib

目标是建立一个构建系统,其中团队[1-3]可以拥有明确指定其依赖关系的独立构建。依赖关系可能如下所示:

 - team1
   - common/net
   - team3/lib
 - team2
   - common/database
 - team3

因此,例如,team1的构建将包括team1,common / net和team3 / lib中的所有内容;但没有别的。理想情况下,测试将以相同的方式集成(测试team1将运行team1,common / net和team3 / lib的测试)。

我目前正在使用Ant,但还没有找到一种理智的方式来管理这样的层次结构。我开始关注Maven 2管理依赖层次结构的能力,但它似乎想要为每个模块完成成熟的项目。这不会是一个问题,但它似乎迫使我进入一个目录结构,该结构不能很好地映射到传统的Java包层次结构。看起来我可以使用alternative layout来构建我想要的东西,但我担心这可能会变得很脆弱。

有人可以推荐一些可能对我有用的东西吗?

6 个答案:

答案 0 :(得分:2)

我认为你实际上有三个问题。

  • 如何布置项目以使工件有意义。
  • 如何最好地处理每个项目的这些工件的共享。
  • 如何在转换开发团队以使用新项目结构的同时处理生产力损失。

对于第一个问题,尽可能尝试使用Maven约定并将项目组织成多个工件。如果工件应嵌套在父项下,请执行此操作。从最简单的工件开始,该工件没有依赖关系,并通过代码工作。

我不确定您为什么认为布局不支持传统的Java层次结构?它应该工作,特别是如果你使用父poms。

显然,第二个问题可能变得非常少,取决于你如何处理第一个问题。我会错误地创建更多工件而不是更少,并使用像Nexus或Artifactory这样的存储库管理器来管理它们。至少在这种情况下,您的团队的构建可以依靠预先构建和测试的jar,通过访问您的存储库来下载他们正在使用的jar的最新SNAPSHOT或RELEASE。

对于第三个,请确保您使用的是具有Maven支持的IDE。如果你使用像Rational Application Developer 7.0.x这样的东西或者基于Eclipse 3.4以外的IDE,那么你将无法使用M2Eclipse插件。如果没有M2Eclipse,开发人员将不得不跳过一些不理想的手动环。 Netbeans 6.7和6.8拥有非常好的Maven支持。

答案 1 :(得分:0)

正如您所说,Maven 2是您案例的首选。 Maven文件夹结构不是madnatory - 它是可配置的,如果你认为它是不可取的。但是,我认为这是一个很好的结构,你可以毫不懊悔地遵循。

您可以使用repository manager,以便使用某些依赖项的人不一定需要签出他们所依赖的项目。

答案 2 :(得分:0)

  

我目前正在使用Ant,但还没有找到一种理智的方式来管理这样的层次结构。

这很令人惊讶,因为Ant(+ Ivy?)为您提供了所需的所有灵活性。

  

我开始关注Maven 2管理依赖关系层次结构的能力,但它似乎希望每个模块都有完整的项目。

如果你的意思是每个模块一个pom.xml,那么这是正确的。

  

这不是问题,但它似乎迫使我进入一个目录结构,它不能很好地映射到传统的java包层次结构。

是的,Maven附带了一些约定,项目目录结构就是其中之一。这是(有点)可配置但我不认为你能够匹配想要的布局(测试和源到分离的层次结构)。实际上,我强烈建议你使用默认设置,如果你选择Maven ,你应该采用它的理念,它会为你节省很多,真的很多,很痛苦(甚至没有提到一些插件可能会以硬编码的方式使用这些默认值。)

老实说,我并不真正明白你的意思是什么目录结构不能很好地映射到传统的java包层次结构。首先,Maven非常适合Java,所以这对我没有任何意义。其次,这可能更主观,你的布局(分开的测试和源树)对我来说看起来并不传统。也许你应该通过传统来澄清你的意思......

  

似乎我可以使用替代布局来构建我想要的东西,但我担心这可能会变得很脆弱

我不太了解buildr,所以我不能说太多,但我知道它确实更灵活。也就是说,如果Ant在灵活性方面不能让你满意,那么我不明白为什么buildr会更好。

不要忘记,与Maven相比,buildr和Ant + Ivy拥有更小的社区。不要低估这一点,这可能会成为一个真正的问题。

就个人而言,我会选择Maven并重新考虑你的布局。但是,让我说我有偏见。

答案 3 :(得分:0)

  

我开始关注Maven 2管理依赖关系层次结构的能力,但它似乎希望每个模块都有完整的项目。

这是一种方法。或者,可以像这样组织多模块Maven项目:

project
    module-1
        src
            main
                ....
            test
                ....
        pom.xml
    module-2
        src
            main
                ....
            test
                ....
        pom.xml
    ...
    pom.xml

其中每个pom.xml也可以引用其他树定义的模块。顺便说一句,Eclipse maven插件支持这种方法以及更常见的每个项目的单模块方法。

答案 4 :(得分:0)

你想要的是长期给你带来很多麻烦......每个独立的组件都应该用自己的存储库制作成自己的项目,否则,你可能会遇到很多问题一个组件中的更改会破坏其他组件并且更新时间过长。我强烈建议您将每个组件放入自己的项目中并使用Maven2构建。

答案 5 :(得分:0)

你可以用Buildr做到这一点。你可以活一段时间。

当然,像大多数人一样,我宁愿不推荐这种方法。 您还可以使用base_dir来更改项目的基本目录。