2016-01-29 111 views
1

我有一個像下面的父pom。問題與Maven屬性

<?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>com.parent.pom</groupId> 
    <artifactId>parent-pom</artifactId> 
    <version>1.0.0</version> 
    <name>parentpom</name> 
    <packaging>pom</packaging> 
    <properties> 
     <parentversion>1.0.0</parentversion> 
    </properties> 
</project> 

而我的孩子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> 

<parent> 
    <groupId>com.parent.pom</groupId> 
    <artifactId>parent-pom</artifactId> 
    <version>${parentversion}</version> 
    <relativePath>../pom.xml</relativePath> 
    </parent> 
    <groupId>com.child.pom</groupId> 
    <artifactId>child-pom</artifactId> 
    <version>2.0.0</version> 
    <name>Childpom</name> 
    <packaging>pom</packaging> 
</project> 

我的文件夾結構是這樣

POM測試(有根文件夾父POM) ---孩子(有孩子POM)

,當我跑MVN清潔在我的孩子安裝我得到如下的異常。

ERROR] The build could not read 1 project -> [Help 1] 
ERROR] 
ERROR] The project com.child.pom:child-pom:2.0.0 (C:\Users\kk\Desktop\POM-Test\child\pom.xml) has 1 error 
ERROR]  Non-resolvable parent POM: Could not transfer artifact com.parent.pom:parent-pom:pom:${parentversion} from/to central (http://repo.maven.apache.org/ 
maven2): Illegal character in path at index 63: http://repo.maven.apache.org/maven2/com/parent/pom/parent-pom/${parentversion}/parent-pom-${parentversion}.pom 
and 'parent.relativePath' points at wrong local POM @ line 5, column 9 -> [Help 2 

爲什麼我無法安裝此pom?

+0

使用堆棧跟蹤發佈完整的錯誤消息。發佈您運行的Maven命令。也張貼您的目錄結構。 – Tunaki

+0

這應該工作代碼明智的,也許你的文件夾結構或文件命名根本是不正確的? – user1438038

回答

1

開始with Maven 3.2.1您可以使用屬性${revision}${sha1}${changelist}如果你真的喜歡你的版本。

所以你可以使用它像這樣:

<groupId>com.soebes.examples.j2ee</groupId> 
    <artifactId>parent</artifactId> 
    <version>${revision}</version> 
    <packaging>pom</packaging> 

    <modules> 
    <module>child</module> 
    </modules> 

,你可以用它在孩子的是這樣的:

<modelVersion>4.0.0</modelVersion> 

    <parent> 
    <groupId>com.soebes.examples.j2ee</groupId> 
    <artifactId>parent</artifactId> 
    <version>${revision}</version> 
    </parent> 

    <artifactId>child</artifactId> 

現在你要調用的Maven這樣的:

mvn -Drevision=1.2.3-SNAPSHOT clean package 
mvn -Drevision=1.2.3 clean package 

你可以看看full example here.。如果您需要更改版本,我會建議使用versions-maven-plugin將版本內的版本更改爲您喜歡的版本(例如在您的CI解決方案中)或發佈版本,您可以使用maven-release-plugin來處理此版本。對於開發,您應該使用如下內容:1.2.3.45-SNAPSHOT(強調-SNAPSHOT)以確定當前開發中。

此外,給定的<relativePath>../pom.xml</relatvePath>不需要,因爲它是默認值,所以可以省略。

非常重要。如果你有一個像你所描述的結構,那麼孩子應該始終具有與父母相同的版本(如果是像給出的示例那樣構建多個模塊)或父母(公司POM)應該是單獨的項目,這也意味着單獨的git庫。此外,對於其他解釋,請參閱此處:https://stackoverflow.com/a/35057833/296328

1

你不能有一個屬性<parent>部分

Maven的需要加載其父處理構建(項目繼承等)

每個項目被確定的groupId之前設置的所有屬性,artifactId的和版本。在父節中,您需要設置這3個屬性來明確標識父節點。

在過去所有的POM容易更新的版本,可以考慮使用release:update-versions pluginversions:set goal

編輯: 查看有關類似問題這個其他線程:Maven project version inheritance - do I have to specify the parent version?

+0

如果我使用relativePath,那麼它應該理想地工作 – robin

+0

@robin它的工作與否,取決於maven版本(在舊版本上工作),因爲maven不是用來支持這樣的配置 – Prim