2013-06-26 75 views
28

我有一個包含多個模塊的maven項目。在Eclipse中(Juno,使用m2e)它似乎編譯得很好。但是當我在其中一個模塊上進行maven安裝時,構建立即失敗。'dependencies.dependency.version'缺少錯誤,但版本是在父項中管理的

父POM:

<groupId>com.sw.system4</groupId> 
    <artifactId>system4-parent</artifactId> 
    <version>${system4.version}</version> 
    <packaging>pom</packaging> 
    <name>System 4 Parent Project</name> 
    <modules> 
    <module>system4-data</module> 
    ...others... 
    </modules> 
    <properties> 
    <system4.version>0.0.1-SNAPSHOT</system4.version> 
    <spring.version>3.2.3.RELEASE</spring.version> 
    ... others... 
    </properties> 

    <dependencyManagement> 
    <dependencies> 
     <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
     <version>${spring.version}</version> 
     <scope>runtime</scope> 
     </dependency> 
    ... lots of others ... 
    </dependencies> 
    </dependencyManagement> 

兒童POM:

<parent> 
    <groupId>com.sw.system4</groupId> 
    <artifactId>system4-parent</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    </parent> 
    <artifactId>system4-data</artifactId> 
    <dependencies> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
     <scope>runtime</scope> 
    </dependency> 
    ... lots of others... 
    </dependencies> 

當我建,我得到下面的輸出:

[ERROR] The build could not read 1 project -> [Help 1] 
[ERROR] 
[ERROR] The project com.sw.system4:system4-data:0.0.1-SNAPSHOT (C:\work\eclips 
e_workspaces\systemiv\system4-parent\system4-data\pom.xml) has 8 errors 

[ERROR]  'dependencies.dependency.version' for org.springframework:spring-cor 
e:jar is missing. @ line 16, column 16 

... others omitted for clarity ... 

我不明白爲什麼它甚至不試圖編譯。我試圖從父母和孩子中刪除運行時範圍,並沒有區別。請幫忙!

+0

[dependencies.dependency.version可能重複,即使依賴已在它的父級的pom文件的依賴項管理部分中聲明]丟失(http://stackoverflow.com/questions/12900525/dependencies-dependency-version-is -missing-even-the-depen-the-dependency-is-already) – JohnEye

回答

31

一對夫婦的事情,我想你可以嘗試:

  1. 認沽子版本的文字值 pom

    <dependency> 
        <groupId>org.springframework</groupId> 
        <artifactId>spring-core</artifactId> 
        <version>3.2.3.RELEASE</version> 
        <scope>runtime</scope> 
    </dependency> 
    
  2. 清除正常位於C:\ Users \ user.m2 \ repository中的.m2高速緩存。當我在maven工作時,我會說我經常這樣做。特別是在提交之前,我可以讓CI更加自信。您不必每次都需要對文件夾進行覈對,有時候只需要您的項目包和.cache文件夾即可。

  3. 一個relativePath標籤添加到您的父POM聲明

    <parent> 
        <groupId>com.mycompany.app</groupId> 
        <artifactId>my-app</artifactId> 
        <version>1</version> 
    <relativePath>../parent/pom.xml</relativePath> 
    </parent> 
    

它看起來像你有你的勁歌共有8個錯誤。我會嘗試在添加父pom和屬性之前運行一些基本編譯。

+0

只是爲了澄清 - 我排除的其他7個錯誤都是相同的排序 - 即dependencies.dependency.version缺少(其他依賴項) – fancyplants

+3

是我的關鍵:一個模塊不在默認的孩子位置,但更深的一個子目錄。謝謝。 – Glenn

+1

Maven抱怨缺失依賴關係的另一個原因是當在父pom中聲明的依賴關係具有時,它與子pom所尋找的類型不對應。 – zdenekca

1

理論上,maven不允許使用屬性來設置父版本。

在你的情況下,maven可能根本不知道你的父pom的0.0.1-SNAPSHOT版本是當前在你的項目中的,因此它試圖在你的本地回購庫中找到它。它可能找到一個,因爲它是一個快照,但它是一箇舊版本,可能不包含您的依賴關係管理部分。

有一種變通方法,但:

只需更改子POM父節本:

<parent> 
    <groupId>com.sw.system4</groupId> 
    <artifactId>system4-parent</artifactId> 
    <version>${system4.version}</version> 
    <relativePath>../pom.xml</relativePath> <!-- this must match your parent pom location --> 
</parent> 
+0

問題是父項目有其他可以編譯的子項目(模塊)。 relativePath默認正確指向父pom的位置。 – fancyplants

1

對,經過大量的頭髮撕裂我有一個編譯系統。

清潔.m2目錄緩存是一兩件事,幫助(感謝布賴恩)

一個我曾經犯下的錯誤是把2點的版本都依賴於父POM dependencyManagement部分 - 一個與<scope>runtime</scope>和一個沒有 - 這是爲了讓日食開心(即不顯示流氓編譯錯誤)以及能夠在命令行上運行。這只是複雜的事情,所以我刪除了運行時的問題。

式設置父的版本似乎也工作(這是一個恥辱,行家沒有使用這樣的特性更廣泛的支持!)

<parent> 
    <groupId>com.sw.system4</groupId> 
    <artifactId>system4-parent</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    </parent> 

我當時越來越怪異「未能爲所有依賴關係的子模塊中的錯誤收集依賴關係,稱它無法找到父對象 - 即使它的設置與編譯的其他模塊相同。

我終於通過從父pom編譯來解決問題,而不是單獨編譯每個模塊。這告訴我一個錯誤,在一個不同的模塊中進行相對簡單的修復,然後奇怪地完成了所有的編譯。

換句話說,如果您得到有關子模塊A的maven錯誤,實際上它可能與無關子模塊Z有關,所以請看那裏。 (並刪除您的緩存)

+0

清理整個本地回購是一個有點太激進的解決方案...只需刪除您的項目有關的子樹就足夠了。 關於同一主題的另一篇文章:http://stackoverflow.com/questions/2389602/maven2-cannot-find-parent-from-relative-path – Yanflea

5

如果有人在我遇到同樣的問題時發現他們的方式,我的問題是我錯過了我從孩子pom複製的依賴項上的<dependencyManagement>標籤。

+0

和我一直想知道什麼是迄今爲止使用dependencyManagement標籤。這對我有效..我在父pom中缺少這個標籤。 –

+1

你也救了我!謝謝 – madz

0

確保在孩子的項目/父母/版本節點的值相匹配其父的項目/版本值

0

你必須做孩子模塊之前建立父模塊。

0

剛剛工作的是刪除.m2文件夾中的settings.xml文件:該文件告訴項目尋找一個不存在的spring mvc和web版本。

相關問題