2017-06-23 76 views
0

提前使用縮略詞表示歉意。本地jar缺失傳遞Maven依賴關係

我正在工作Maven項目Foo,這取決於當地的罐子BarBar也是使用Maven構建的,由於它是本地jar,我在Foo的文件夾結構中創建了一個本地回購,並將jar放在那裏。

Bar.jar置於base_dir_of_Foo\repo\group_ID\artifact_ID\1.0-SNAPSHOT\Bar.jar

我遇到的問題是,當我運行Foo時,它拋出一個NoClassDefFoundError,因爲它無法在Bar的某個依賴關係中找到類。因此,Foo通過Bar缺少傳遞依賴關係。

有一點需要注意的是,當我爲Foo運行mvn clean package時,我看到一條警告「缺少POM for Bar」。 Foo正在使用反射調用B,並且Foo能夠找到在Bar中定義的類,但看起來像A無法計算出Bar的依賴關係。任何想法爲什麼發生這種情況?

本地回購是Foopom.xml定義:

<repositories> 
    <repository> 
     <id>local-repo</id> 
     <name>Local</name> 
     <url>file://${basedir}/repo</url> 
    </repository> 
</repositories> 

最後Foo取決於Bar默認編譯範圍:

<dependency> 
    <groupId>group_ID</groupId> 
    <artifactId>artifact_ID</artifactId> 
    <version>1.0-SNAPSHOT</version> 
</dependency> 

更新: 我發現爲什麼聚甲醛Bar沒有找到,這是因爲我們把Bar.jar放在本地repo中,maven只會將jar文件複製到本地回購站itory緩存,它不會從jar中提取pom.xml,這是預期的嗎?

Inside C:\ Users \ hancwang.m2 \ repository \ group-id \ Bar \ 1.0-SNAPSHOT,我看到Bar-1.0-snapshot.jar被複制過來,但沒有Bar-1.0-snapshot。 POM。

+0

你打造酒吧的源代碼使用Maven本地? – nandsito

+0

是的,我確實,然後我將Bar.jar複製到Foo下的本地倉庫。 –

+0

請嘗試我的回答 – nandsito

回答

1

您的<repository>定義可能指向不完整的存儲庫,例如,回購缺少.pom文件。

假設您在本地創建Bar源代碼,如果您在Bar中運行mvn install,則會將其工件安裝在本地存儲庫中。這樣,Foo會正常找到Bar。在這種情況下,您不需要定義<repository>

所以,儘量:在酒吧

  • 運行mvn installmvn clean install
  • 取出<repository>定義一個指向file://罐子
+0

問題是,另一個人可以混淆Foo但無法訪問Bar,這將無法構建Foo。 –

+0

@HanchiWang是不是可以通過其他人建立Bar源代碼? – nandsito

+0

他們不能,因爲1)Foo是開源的,但Bar不是,2)我希望Foo的客戶能夠運行jar文件和mvn軟件包。 –