2014-04-04 35 views
0

我正在使用maven,並且我正在開發同一個父類下的3個類,儘管它們屬於不同的實際項目。
這三個類屬於不同的pom文件和工件名稱,它們(在它們的鏈式依賴關係之外)完全獨立。
爲了簡單起見,我會打電話給他們A,B和Cmaven不包括javac所需的類路徑文件

A依賴於B.
B依賴於C.

A,在某些時候,使得一個新實例B.

... 
B b = new B(); 
... 

乙這裏擴展了C

... 
public class B extends C { 
... 

是POM依賴關係:
答:

<dependencies> 
    <dependency> 
     <groupId>my.group</groupId> 
     <artifactId>B</artifactId> 
    </dependency> 
    </dependencies> 
    <dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>my.group</groupId> 
      <artifactId>B</artifactId> 
      <version>0.0.1</version> 
     </dependency> 
    </dependencies> 
    </dependencyManagement> 

B:

<dependencies> 
    <dependency> 
     <groupId>my.group</groupId> 
     <artifactId>C</artifactId> 
    </dependency> 
    </dependencies> 
    <dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>my.group</groupId> 
      <artifactId>C</artifactId> 
      <version>0.0.1</version> 
     </dependency> 
    </dependencies> 
    </dependencyManagement> 

當我在父POM文件maven install,它正確地定義模塊順序

[INFO] Reactor Build Order: 
[INFO] 
[INFO] C 
[INFO] B 
[INFO] A 

首先它編譯C和B正確地。然後,當它的時間來編譯:

/path/to/A/A.java[27,28] error: cannot access C

如果您想了解什麼是「27,28」,它是這裏的「新」,也就是上面引述上面的線。

有趣的是:

  1. 如果我在B首先,然後在一個mvn install(我知道爲什麼;)做一個mvn install),它的工作原理,但是這不是一個解決方案由於的要求要求的工作。
  2. 如果我將C添加到A的要求,它也可以。但它不是一個解決方案,因爲C不是A的要求,它是B的要求。如果出於某種原因A停止使用B,那麼做任何事情的人都必須記住從要求中移除C是沒有意義的。

我忘了提:

出於某種原因,在依賴關係樹:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ A --- 
[INFO] my.group:A:jar:0.0.1 
[INFO] +- my.group:B:jar:0.0.1:provided 

C沒有出現在需求樹的要求。雖然:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ B --- 
[INFO] my.group:B:jar:0.0.1 
[INFO] \- my.group:C:jar:0.0.1:provided 

C是B的需求樹中的需求。

奇怪的事情是:爲什麼A不是C的需求樹?

+0

在您的Java代碼中,顯示您的軟件包名稱和相應的導入。使這些摘錄看起來像適當的Java代碼。顯示這些源文件的路徑。向我們展示項目中目錄的實際結構。 (你在這裏留下了太多的猜測空間,我們並不是所有的心理學家)。 – carlspring

回答

1

這是因爲您在B中聲明瞭B的範圍爲provided。當範圍是provided時,maven不包括transitive依賴項。

doc報價,

此範圍僅適用於編譯和測試類路徑中, 而不是傳遞。

+0

AHA!就是這樣了!謝謝!順便說一下,考慮到我不希望Maven在執行時將其添加到類路徑中(僅在編譯時)(請不要問我「爲什麼」)。我有什麼選擇使用?基本上我想要:「這個範圍只在編譯類路徑中可用,**是**傳遞。」 – brunoais

+0

(同時我正在尋找) – brunoais