2016-02-11 57 views
11

我已經創建了一個遵循vogella廣泛的Tycho教程的boiler-plate項目。在Eclipse RCP中使用第三方庫谷歌應用

enter image description here

事實:

  • 沒有什麼特點,而且也沒有插件。唯一的插件是RCP應用程序,它也是入口點。

問題:

  • 我不知道在pom.xml我包括第三方的依賴性。

  • 不能包括他們在RCP項目,因爲POM的包裝eclipse-plugin,而不是jar。從我注意到的情況來看,如果我將包裝更改爲jar,則會自動添加「Maven Dependencies」庫。如果我改回eclipse-plugin,他們會被刪除。

問題:

  • 我在哪裏添加的依賴?我的項目中沒有包裝jar包裝。
  • 我應該使用必要的JAR創建單獨的項目嗎?我如何將該依賴項包含到我的整個項目中?
  • 爲這個RCP應用程序創建一個單獨的插件和功能真的有那麼好的做法嗎?

相關的解決方案:

  • 「更新項目」 不工作,也不做N個其他的解決方案中的其他SO問題。
  • 還有this questionthat question,但我不完全得到答案
+0

你說什麼依賴關係?第三方圖書館?最簡單的方法是將它們包含在項目類路徑中,並要求將它們包含在構建build.properties文件中(當您雙擊plugin.xml時通過插件編輯器)。如果您需要eclipse-plugin依賴項,您也可以使用插件編輯器添加它們。你也在談論maven,你是否用maven使用tycho?如果是這樣,maven與tycho插件將使用您的plugin.xml/manifest/build.properties ...文件中的數據來構建您的插件 – titou10

+1

應該有一個MANIFEST.MF與每個通常依賴關係的插件關聯被提及。 – SomeDude

+0

@ titou10我不想手動添加依賴關係..我正在使用Maven + Tycho。我只是不知道哪個項目的哪個pom.xml應該添加依賴關係。 – GGrec

回答

15

我認爲你有一個根本性的誤解。

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。如果你所有的依賴都已經是插件了,那你就很好。否則,您可能必須使用上述解決方法來打包一組庫供插件使用。