我認爲你有一個根本性的誤解。
Maven的:Maven的確定是否所有的項目依賴通過pom.xml中,並自動解析傳遞依賴(假設所有的POM文件和文物中,你已經配置的倉庫存在,並正確地申報其依賴)。
Tycho:問題是Eclipse已經有了基於產品文件,feature.xml文件和插件MANIFEST.MF文件的自己的項目模型。 Tycho利用Eclipse的Maven機制,但想法是,pom.xml文件只是配置Maven插件並聲明封裝類型。這爲Maven提供了一個切入點,但是Tycho接手了。雖然Maven通常會從pom中的信息構建依賴鏈。xml文件,Tycho正在從產品,功能和MANIFEST.MF文件中的信息構建依賴關係更改。您不要在pom.xml文件中放置任何依賴項。 Tycho還使用Eclipse p2存儲庫(而不是普通的Maven存儲庫)來查找在本地模塊或目標平臺中找不到的依賴插件。
對於許多Eclipse開發人員來說,這實際上是一個好處,因爲他們已經在Eclipse插件,功能和產品中正確設置了所有內容。他們不想在pom.xml中重複所有的依賴關係。
在Eclipse插件中使用庫:在Eclipse中,如果要使用尚未打包爲Eclipse插件的庫,則有幾個選項。您的插件可以將一組JAR包含在libs文件夾中,然後在插件和運行時類路徑中包含該libs文件夾(請參閱build.properties文件)。另一種選擇是創建自己的「庫插件」,將JAR庫重新打包爲Eclipse插件。另請參閱https://wiki.eclipse.org/FAQ_What_is_the_classpath_of_a_plug-in%3F。這是你得到的答案。
問題是,如果您嘗試將包含多個JAR的複雜庫包含在通常分佈並通過Maven包含在標準Java項目中。我在項目中使用Jersey JAX-RS實現時遇到了這個問題。沒有p2存儲庫將所有這些庫作爲具有正確依賴信息的插件。
簡易解決方案:如果您需要公共庫,請首先檢查Orbit項目以查看庫是否已被封裝爲Eclipse插件http://www.eclipse.org/orbit/。在這種情況下,您可以下載它們並將它們包含在目標平臺中,或者可以在構建時間(Tycho)時從它們的p2存儲庫動態獲取它們。你的插件只包含這些插件作爲依賴項(在他們的MANIFEST.MF文件中)。
解決方法/解決方案:在我們的情況下,新澤西州JAX-RS是不是可以作爲一個Eclipse插件,它有一堆傳遞依賴的。解決方法是創建一個Eclipse「庫插件」,就像我上面提到的兩個pom文件一樣。我們最初創建了一個帶有空的 libs文件夾的骨架插件。一個pom文件只是一個標準的Maven pom文件,其中<packaging>jar</packaging>
聲明瞭引入Jersey JAX-RS實現及其所有依賴關係所需的頂級依賴關係。依賴關係聲明爲<scope>compile</scope>
。我們使用maven-dependency-plugin將所有這些依賴項複製到項目的libs文件夾中。
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>compile</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>libs</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
實際上,我們結束了與POM用手不時更新庫運行Maven的,然後我們就檢查了插件與所有相關的JAR的源代碼控制。
稍後檢查構建,我發現在我們啓動構建的Maven/Tycho部分之前,我們實際使用單獨的構建任務使用Maven實時填充libs文件夾。當然,插件的MANIFEST-MF文件的Bundle-ClassPath和Export-Package條目直接來自源代碼管理。我們必須不時檢查這些文件,以確保它們與我們從Maven獲得的庫和包相匹配。 (除非我們碰到主要的庫版本或在Maven級別添加新的依賴關係,否則這種變化趨勢不會很大。)插件的build.properties將libs /文件夾作爲bin.includes的一部分。
在開發環境中,在我們第一次檢查代碼之後,我們只需在項目的「副本依賴」pom文件中運行mvn(帶有外部工具啓動配置,該配置也已簽入該項目)。用所有JAX-RS庫和依賴關係填充libs文件夾。當我們更新一些關於依賴關係的內容時,或者當我們在具有不同版本的JAX-RS依賴關係的分支之間跳轉時,我們只需再次運行它。我們設置.gitignore來確保我們不會將庫提交給Git。
這個項目的另一個pom被設置爲像<packaging>eclipse-plugin</packaging>
的正常Tycho pom文件。在我們的自動構建過程中,我們在構建過程的早期階段(在檢查完成後)運行一步,使用jar pom調用mvn來填充這些庫。然後,我們繼續使用eclipse-plugin pom編譯Maven/Tycho主版本。 eclipse-plugin pom沒有依賴信息(如上所述)。它只是爲Tycho提供了一種識別Eclipse插件並基於其MANIFEST.MF和build.properties文件構建的方法。但是構建的插件包含並公開了由mvn調用jar pom步驟填充的所有這些庫。
因此,這有點混亂,但這是我們在幾年前發現的最佳解決方案,當時我們遇到了這個問題。我不確定Tycho是否正在做任何工作來允許某種混合的Maven/Tycho構建,這可以作爲構建的一部分自動完成。我想我應該問問開發人員。 :)
您的問題:
- 我在哪裏添加的依賴?我的項目中沒有包裝罐子。答案:上面的解決方法可讓您在一個項目中執行此操作。您只有兩個pom文件,如pom_deps.xml和pom.xml。您只需分別調用pom_deps.xml來填充libs文件夾(在開發環境中並使用自動構建)。
- 我應該用必要的JAR創建一個單獨的項目嗎?我如何將該依賴項包含到我的整個項目中?答:我上面描述的解決方法可以讓你用一個項目來完成。另一種方法是創建一個單獨的JAR項目,但我認爲您的Eclipse RCP應用程序不能真正包含
<packaging>jar</packaging>
模塊。我發現這樣做的唯一方法是使用類似的解決方法。首先構建JAR模塊,將其安裝到Maven存儲庫中,然後讓其中一個插件項目將JAR捆綁到其libs文件夾中。 (如果你真的想這樣做,請問,我們有一個情況,我們也必須這樣做,並且我可以提供我們在開發和構建中所做的步驟,以使其工作。我認爲單個項目解決方法我提供的上述內容對您的情況更有意義。)
- 對於此RCP應用程序創建單獨的插件和功能是否真的有很好的做法?答案:這確實是一個單獨的問題。如果您有多個插件的功能,則會遇到同樣的問題。 Tycho可以處理產品/功能/插件,但無法跳入基於Maven的依賴關係解決方案。你會最終不得不使用相同的解決方法
摘要:最根本的問題是,Eclipse插件無法「看到」裸JAR庫。該插件需要將庫包含在本地libs文件夾中(在MANIFEST.MF中具有匹配的Bundle-ClassPath條目),或者它需要依賴某個導出相應包的其他插件。 Tycho只是通過Eclipse插件解決了依賴關係,並且無法直接利用正常的Maven依賴關係解析來引入一堆JAR。如果你所有的依賴都已經是插件了,那你就很好。否則,您可能必須使用上述解決方法來打包一組庫供插件使用。
你說什麼依賴關係?第三方圖書館?最簡單的方法是將它們包含在項目類路徑中,並要求將它們包含在構建build.properties文件中(當您雙擊plugin.xml時通過插件編輯器)。如果您需要eclipse-plugin依賴項,您也可以使用插件編輯器添加它們。你也在談論maven,你是否用maven使用tycho?如果是這樣,maven與tycho插件將使用您的plugin.xml/manifest/build.properties ...文件中的數據來構建您的插件 – titou10
應該有一個MANIFEST.MF與每個通常依賴關係的插件關聯被提及。 – SomeDude
@ titou10我不想手動添加依賴關係..我正在使用Maven + Tycho。我只是不知道哪個項目的哪個pom.xml應該添加依賴關係。 – GGrec