2010-07-19 73 views
5

我想用maven和eclipse構建我的應用程序。 我有我的本地機器上的第三方罐子的依賴項。 這裏是我的pom.xml本地罐子不包含在類路徑中('<scope>系統</scope>`)

<dependency> 
    <groupId>sourceforge.net</groupId> 
    <artifactId>zipdiff</artifactId> 
    <version>0.4</version> 
    <scope>system</scope> 
    <systemPath>C:/gelcap/lib/zipdiff-0.4.jar</systemPath> 
</dependency> 

<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.11</version> 
</dependency> 
當我MVN運行

:安裝它爲我的項目創建WAR文件。 但問題是它不包括zipdiff.jar文件到web-inf/lib文件夾,它只包含下載的文件。我需要包括從本地系統複製文件,但maven忽略它們。 我沒有想到爲什麼它會發生,爲什麼maven沒有將包含系統範圍的文件包含在我的war文件中。 請給我任何想法如何解決這個問題。 在此先感謝

回答

7

對於「系統」範圍,容器預計會提供人造物。從maven docs

提供

這很像編譯,而是指你所期望的JDK或 容器以提供 運行時的依賴。例如,對於Java 企業版構建 Web應用程序時,你會設置了Servlet API的依賴 和 相關的Java EE的API提供的範圍,因爲 Web容器提供 這些類。此範圍僅在編譯和測試 類路徑中可用的 ,並且不是傳遞性的。

[...]

系統

此範圍相似,除了你必須 提供包含它 明確的JAR來提供。工件始終可用 ,在 存儲庫中不會查找該工件。

通過使用系統範圍,您向war插件指示容器將提供此依賴關係。因爲這不是你打算做的事情,所以最簡單的解決方案就是把你的工件放入一個倉庫,或者你的本地Maven倉庫,或者你自己的內聯網上的Maven倉庫,如果你有的話。

install:install-file目標可用於將單個文件(不帶POM)安裝到本地存儲庫。完成此操作後,將依賴類型更改爲「compile」並刪除「systemPath」元素。

在我的日常工作中,我們使用Nexus來管理公司範圍內的公司資料庫。您可以爲自己的文物分別創建獨立的存儲庫,而不是第三方文物。 Nexus還充當代理,從外部存儲庫中緩存文物,加快構建的速度。這意味着只有使用其他回購協議中不可用的新依賴項的開發人員才能上傳 - 之後,所有其他開發人員都可以使用它 - 他們可以從SCM簽出並構建,而不用擔心依賴關係的位置。

+0

+1對於Nexus和另一個虛擬+1的建議,只爲圖書館創建工件(使用nexus,你可以從網頁前端完成 - 所以我建議使用nexus,即使是在本地的單用戶環境中) – 2010-07-19 12:56:13

0

只是一個打擊我的眼睛: 在你使用正常的unix樣式斜線/的路徑。 Windows對路徑使用反斜槓:。 我不知道Maven是能夠將這些轉換成對方,所以也許嘗試輸入如下路徑:

C:\軟膠囊\ LIB \ zipdiff-0.4.jar

+0

Nops它沒有區別 – viren 2010-07-19 12:17:39

1

嘗試installing the jars to your local repository。當它的構建時間不同時,你的本地jar和更大的版本庫中的jar不會有區別。

+0

嗨Allain, 我安裝我的jar文件到本地maven存儲庫,但是當我運行目標maven:安裝形式的eclipse,但它仍然沒有將jar複製到web-inf/lib文件夾。我執行了以下步驟: 1.運行以下命令 mvn install:install-file -DgroupId = sourceforge.net -DartifactId = zipdiff -Dversion = 0.4 -Dfile = C:/gelcap/lib/zipdiff-0.4.jar - Dpackaging = jar -DgeneratePom = true 它爲本地maven存儲庫中的zipdiff jar文件創建了一個文件夾。 然後運行maven:從eclipse安裝。 BUt仍然創建的戰爭沒有zipdiff.jar文件 – viren 2010-07-19 12:14:32

+0

YOu也必須更改您的POM文件並刪除依賴項的範圍。然後,Maven應該從存儲庫中提取依賴項並將其包含在戰爭中。 – Cliff 2010-07-19 12:20:33

+0

是這個工作謝謝allain – viren 2010-07-19 12:36:38

-1

之前沒有試過這個,所以它可能無法正常工作,你可以改變範圍來編譯?

<dependency> 
    <groupId>sourceforge.net</groupId> 
    <artifactId>zipdiff</artifactId> 
    <version>0.4</version> 
    <scope>compile</scope> 
    <systemPath>C:/gelcap/lib/zipdiff-0.4.jar</systemPath> 
</dependency> 
+1

嗨克里斯, FYI 你不能使用系統路徑與編譯範圍 – viren 2010-07-19 12:19:45

+0

酷,不知道 – 2010-07-19 13:39:37

6

我沒有得到任何認爲原因是什麼,爲什麼Maven是不包括與系統範圍的文件到我的戰爭文件。請給我任何想法如何解決這個問題。

這是設計,system作用域依賴關係應該被提供爲documented

其實,我已經寫了許多倍,system範圍的依賴性,應避免(herehereherehere)。他們大部分時間都是不好的做法,人們濫用他們,他們幾乎總是產生更多的麻煩而不是好處。

我引述Dependency Scopes微型導軌,如果你想的視圖中的「官方」觀點:

  • system:這種關係需要在項目生命週期的某些階段,但系統 - 具體。 不鼓勵使用此範圍:這被認爲是「高級」功能,只有在您真正瞭解其使用的所有後果時才能使用,如果實際上不可能量化,那麼該功能可能非常困難。根據定義,此範圍將使您的構建不可移植。在某些邊緣情況下可能有必要。系統範圍包括<systemPath>元素,該元素指向本地計算機上此依賴項的物理位置。因此它被用來指代預期存在於給定本地機器上的某個不在存儲庫中的人工產物;其路徑可能因機器對機器而異。 systemPath元素可以引用其路徑中的環境變量:例如${JAVA_HOME}

所以,而是採用了system範圍,或者:

  • 通過install:install-file添加您的庫到你的本地倉庫。這是一種快速而骯髒的方式來讓事情順利進行,如果你是孤身一人,這可能是一種選擇,但它會使你的構建不可移植。
  • 安裝並運行Nexus,Archiva或Artifactory等「企業存儲庫」,並通過deploy:deploy-file添加庫。這是理想的方案。
  • 按照this previous answer中所述設置基於文件的存儲庫,並將您的庫放在那裏。如果您沒有公司存儲庫,但需要作爲一個團隊工作並且不想犧牲可移植性,那麼這就是妥協。

請停止使用system範圍。