2010-07-21 118 views
84

我想弄清楚如何组织很多(大约50+)maven2项目,以便他们可以部署到一个中央连接库。当使用mvn deploy目标,一个人需要指定目标的distributionManagement标签是这样的:如何指定maven的分发管理组织范围?

<distributionManagement> 
    <repository> 
     <id>nexus-site</id> 
     <url>http://central_nexus/server</url> 
    </repository> 
</distributionManagement> 

现在,我不希望每一个pom.xml的(那些50岁以上的)超过包含该数据块并重新开始。我的第一个虽然将settings.xml文件,但它似乎不可能(在设计上)在那里定义它。 所以,第一个问题是,为什么是这种情况?如果可以的话,我可以在maven2发行版的settings.xml中指定它,它可以分发给所有开发者。

我发现的唯一可能的解决方案是创建一个组织范围的master-pom项目,该项目包含这些设置,并使所有其他pom.xml通过<parent>标记取决于此master-pom。但是,这看起来有点怪多模块构建中:

- master configuration POM (pm) 
- Project 1 parent pom (p1 with module 1 and module 2 as modules) 
    - Project 1 module pom (with pm as parent) 
    - Project 2 module pom (with pm as parent) 

通常我该模块劲歌应该使用父POM,而不是一些不同的一个所有文档中读取。但在阅读关于继承与聚合的maven网站之后,写道它的确是可行的。

一个问题我发现了与Maven站点的一代,似乎有与此设置问题(模块不能正确连接,如果他们没有直接回引)

所以,这是一个有效的方法?任何其他更明显,更简单的解决方案?

+1

http://maven.apache.org/pom.html#Distribution_Management – OhadR 2014-07-23 11:08:05

+4

@OhadR:他们只写如何写在一个项目中。要点是我不想重复它约500次... – mglauche 2014-07-23 13:45:00

+1

我明白了。采取点。所以回答的人说,你可以有一个主要的POM为项目,这将包含'distribMngmnt'... – OhadR 2014-07-24 10:42:45

回答

124

最好的解决方案是为您的组织中的所有项目创建一个简单的父pom文件项目(包装'pom')。

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>your.company</groupId> 
    <artifactId>company-parent</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <distributionManagement> 
     <repository> 
      <id>nexus-site</id> 
      <url>http://central_nexus/server</url> 
     </repository> 
    </distributionManagement> 

</project> 

这可以构建,发布,并部署到您的本地连结,所以每个人都可以访问它的神器。

现在对于你想使用它的所有项目,只是包括本节:

<parent> 
    <groupId>your.company</groupId> 
    <artifactId>company-parent</artifactId> 
    <version>1.0.0</version> 
</parent> 

该解决方案将让您轻松添加其他常用的东西贵公司的所有项目。例如,如果您想将您的JUnit使用标准化为特定版本,那么这将是完美的地方。

如果您有使用具有自己父级的多模块结构的项目,Maven还支持链接继承,因此,将项目的父级文件引用到您公司的父级pom并让项目的子模块不可用甚至知道你的公司的父母。

我从您的示例项目结构中看到,您试图将您的父项目放在与聚合器pom相同的级别。如果您的项目需要自己的父项,我发现的最好方法是将父项包含在与其余模块相同的级别中,并将您的aggregator pom.xml文件放在所有模块目录所在的根目录下。

- pom.xml (aggregator) 
    - project-parent 
    - project-module1 
    - project-module2 

你这个结构做的是包括你的父母模块中的聚合,并建立一切以从根目录“MVN安装”。

我们在我的组织中使用了这个确切的解决方案,它经受住了时间的考验,为我们工作得非常好。

+2

我不知道链接继承,好点! – mglauche 2010-07-22 07:49:56

+0

这里是另一个我更详细地描述项目继承的答案,以及如何管理它的继承复杂性,赦免双关语。 ;)http://stackoverflow.com/questions/6347913/ – 2011-06-14 22:02:26

+7

只是一个小纸条:出于原因*为什么*公司父母是最好的解决方案,请参阅讨论[无法在settings.xml中指定distributionManagement](http ://maven.40175.n5.nabble.com/Can-t-specify-distributionManagement-in-settings-xml-td3181781.html)来自Maven用户的列表。 – 2011-10-21 10:10:49