2013-12-11 53 views
4

我有一個整體完全的,其在其pom.xml中相同的URL項目:

<url>https://github.com/malkusch/${project.artifactId}</url> 

<scm> 
    <connection>scm:git:git://github.com/malkusch/${project.artifactId}.git</connection> 
    <developerConnection>scm:git:[email protected]:malkusch/${project.artifactId}.git</developerConnection> 
    <url>https://github.com/malkusch/${project.artifactId}</url> 
</scm> 

<issueManagement> 
    <system>github</system> 
    <url>https://github.com/malkusch/${project.artifactId}/issues</url> 
</issueManagement> 

所以我認爲這是一個偉大的主意,把那成一個parent pom.xml。但是,有效的聚甲醛生產奇$ {} project.artifactId:

<parent> 
    <groupId>de.malkusch.parent</groupId> 
    <artifactId>oss-parent</artifactId> 
    <version>1.1-SNAPSHOT</version> 
</parent> 
<groupId>de.malkusch.localized</groupId> 
<artifactId>localized</artifactId> 
<url>https://github.com/malkusch/localized/localized</url> 
<scm> 
    <connection>scm:git:git://github.com/malkusch/localized.git/localized</connection> 
    <developerConnection>scm:git:[email protected]:malkusch/localized.git/localized</developerConnection> 
    <url>https://github.com/malkusch/localized/localized</url> 
</scm> 
<issueManagement> 
    <system>github</system> 
    <url>https://github.com/malkusch/localized/issues</url> 
</issueManagement> 

你注意到只有issueManagement.url被正確解析。其他人很奇怪,特別是$ {project.artifactId} .git - >localized.git/localized。我使用的是Maven 3.0.4。我是否使用了一些未定義的功能?這是一個錯誤嗎?

回答

6

是的,這種行爲很混亂。

也許理解這個最簡單的方法是考慮Maven本身是如何構建的。它在Subversion中,反應器poms(部分的poms)往往也是模塊本身的父級poms。

project/pom.xml (artifactId: parent) 
|-+ module1/pom.xml (artifactId: module1, inherits parent) 
|-+ module2/pom.xml (artifactId: module2, inherits parent) 

這裏,父POM(項目/ pom.xml中)含有<modules>部,並且也由模塊1和模塊2繼承。

現在假設父級的SCM URL是svn://host/path/project/:maven應該做些什麼,以便您不必在兩個模塊中再次指定SCM URL?

那麼,module1的SCM URL是svn://host/path/project/module1,Maven可以通過將artifactId添加到它從父pom繼承的SCM URL來計算該值。它只需要將artifactId附加到SCM URL。所以這正是它所做的。

所以這就是你看到的行爲:

$ {} project.artifactId git的成爲localized.git /本地化如下:

localized -> from ${project.artifactId} in the inherited SCM URL 
.git  -> from the the inherited SCM URL 
/localized -> from adding the artifactId to the inherited SCM URL 

您將看到此行爲在SCM URL中,以及(我認爲)project.urldistributionMangement.site.url中的URL。但是,Maven並不認爲issueManagement URL結構遵循您的目錄結構,這就是您看到它正確繼承的原因。

+2

哇!此行爲是否記錄在案? $ {project.artifactId}的上下文敏感性讓我印象深刻。 –

+0

Maven JIRA中似乎有不少問題,這表明對此行爲有很多困惑。 JörgSchaible的評論提供了我能找到的行爲的最佳解釋:http://jira.codehaus.org/browse/MNG-2290?focusedCommentId=103845#comment-103845 –

+1

是的,一切都被記錄下來:那是模型的結果請參閱http://maven.apache.org/ref/current/maven-model-builder/ – hboutemy

0

添加到已經大背景下給出的信息,以便仍然有效scm url,部署since Maven 3.5可以糾正被每project.directory屬性附加的「模塊」的名字:

<properties> 
    <project.directory>${project.artifactId}</project.directory> 
</properties> 

然後你只是簡化developerConnection不包括artifactId了,因爲它會被追加爲project.directory

<scm> 
    <developerConnection>scm:git:[email protected]:</developerConnection> 
</scm> 

假設THI s不會與任何其他goals衝突,那應該允許deploy目標使用正確的git url來完成其工作,其中您已經在父pom中定義了scm.developerConnection的非多模塊Maven項目。

當我運行一個deploy,我看到行家做了正確的推動,如:

[INFO] Executing: /bin/sh -c cd /projectDir/proj && git push [email protected]:proj master:master