簡體   English   中英

如何在Eclipse PDE中表達項目間依賴項

[英]How to express inter project dependencies in Eclipse PDE

我正在尋找處理混合項目類型之間的項目間依賴關系的最佳實踐,其中一些項目是eclipse插件/ OSGI包項目(RCP應用程序),而其他項目只是普通的舊Java項目(Web服務模塊)。 很少有eclipse插件依賴於Java項目。

我的問題是,至少就我看來,沒有辦法在Eclipse PDE環境中干凈地表達這種依賴。 我可以讓插件項目依賴於其他插件項目(通過Import-PackageRequire-Bundle清單頭文件),而不是普通java項目。

我似乎能夠讓項目從工作空間中的另一個項目聲明對jar的依賴,但這些jar文件既不會被導出也不會被啟動配置(雖然,java代碼編輯看到庫很好)。

“Java項目”用於構建部署在J2EE容器(目前為JBoss 4.2.2)上的服務,並在某些情況下生成多個jar - 一個用於部署到JBoss耳朵,另一個用於客戶端代碼(一個用於客戶端代碼) RCP應用程序)。

我們現在“解決”這個問題的方式是我們還有兩個外部工具啟動器配置 - 一個用於構建所有jar,另一個用於將這些jar復制到插件項目中。 這樣做(有點),但是“整個構建”和“復制罐子”目標會產生相當大的構建步驟,繞過整個eclipse增量構建功能並通過復制jar而不是僅僅引用項目我將依賴關系信息解耦並請求相當大的工作空間刷新,這就像糖果一樣耗盡了開發時間。

我想要的是一個更加“自然”的工作空間設置,它可以管理項目之間的依賴關系並僅在需要時請求增量重建,能夠使用RCP應用程序插件中的服務庫中的客戶端代碼並且能夠啟動RCP應用程序,其中包含所需的所有必需類。

那么我可以吃蛋糕嗎?)

注意

需要說明的是,目前依賴管理和模塊管理與Eclipse PDE配置有關。

我很清楚像[Maven],[Ivy]和[Buckminster]這樣的產品,他們解決了一個完全不同的問題(一旦我解決了工作區配置問題,這些產品實際上可以派上用場實現工作空間並構建產品)

Eclipse項目依賴於項目屬性(依賴項目?)中的復選框,這就是Eclipse決定構建哪個項目的方式。 您可以自己設置,但通常在更改Java構建路徑時設置。 它將數據存儲在.project文件IIRC中,因此一旦您瀏覽了GUI並看到了哪些更改,您就可以更靈活地應用其他文件。

但是,聽起來你想要混合搭配Jars和Bundles。 簡單的方法是將所有項目視為Java項目。 在PDE項目中,您實際上可以進入並調整Java構建路徑; 它會抱怨並說它不是正確的方法,但它會讓你有一個PDE項目依賴於Java項目而沒有那么蓬松的JARing。 話雖如此,如果這種方法存在運行時問題,我也不會感到驚訝 - PDE運行時可能不會這樣看。

另一種方法是讓你的JAR自己成為PDE / OSGi包。 畢竟,一個OSGi包只不過是一個JAR,它在Manifest中有一些額外的功能,它可以讓你使用自動依賴管理輕松地開發和組裝你的項目。 這可能是最容易實現的,即使你真的不需要清單出現在你的捆綁包中。 但這樣做意味着您的PDE應用程序可以采用更模塊化的方法,而不是根據需要在每個插件中嵌入庫。

因此,PDE可以生成OSGi包,這只是JAR + Manifest的另一個名稱。 您可以在其他環境中以完全相同的方式使用JAR(例如,對於您的EAR或其他客戶端使用),您可以利用應用程序中的OSGi層。 考慮到你所談論的混合束的類型,沒有理由不這樣做。

我從來沒有這樣做過,所以這是一種理論方法。 但我會嘗試像ivy或maven2這樣的依賴管理系統。

由於maven2做得更多,然后只是依賴管理,我建議在這種情況下使用常春藤。

我們的解決方案使用Ant構建器將普通Java項目的“classes”目錄直接復制到插件項目的頂層目錄中。 我們跳過JAR構建步驟以節省時間,並且它運行良好。 如果插件項目依賴於已經構建的外部JAR,我們也會復制它們。

這里是如何在Eclipse 3.5中設置它(抱歉奇怪的格式,但這是我能找到保留縮進的唯一方法):

 Create empty "classes" dir in plugin project Select plugin project, hit F5 to refresh resources Create new Ant build file in plugin project to copy dependencies (ours is shown below) Right-click plugin project, select Properties Select Builders Click "New..." (brings up Edit Configuration dialog) Select Ant Builder and click "OK" Name your builder (ours is called "PluginProject externals") Browse workspace for Buildfile (ours is ${workspace_loc:/PluginProject/copyDependencies.xml}) click Refresh tab check "Refresh resources upon completion", click "Specific resources" click "Specify Resources...", check box for the classes dir, click "Finish" Click "OK" (closes Edit Configuration dialog) Click "Up" to move "PluginProject externals" to top of builder list Click "OK" (closes Properties dialog) Open your plugin project's MANIFEST.MF Click "Runtime" tab Click "Add..." under "Classpath", select your the "classes" dir and JARs and click "OK" 

在插件項目中手動創建空的“classes”目錄是為了讓您可以告訴新構建器刷新該資源(在運行新構建器之前尚不存在)。 這是我們的copyDependencies.xml文件中的內容:

<project name="Copy dependencies" default="copyDependencies" basedir=".">
  <!--
    This copying is needed because it appears that Eclipse plugins can't
    depend directly on external Eclipse projects.
  -->
  <description>
    Copies external dependency class andd JAR files into this plugin's directory.
  </description>

  <target name="copyDependencies">
    <copy file="../External/JDOM/jdom-1.0/build/jdom.jar" todir="." preservelastmodified="true"/>
    <copy file="../External/Xalan/xalan-j_2_6_0/bin/xalan.jar" todir="." preservelastmodified="true"/>
    <copy file="../External/Xalan/xalan-j_2_6_0/bin/xercesImpl.jar" todir="." preservelastmodified="true"/>
    <copy file="../External/Xalan/xalan-j_2_6_0/bin/xml-apis.jar" todir="." preservelastmodified="true"/>
    <copy todir="./classes/com/arm" preservelastmodified="true">
      <fileset dir="../Utilities/src/com/arm" excludes="**/*.java"/>
    </copy>
  </target>
  <target name="clean" description="Deletes local copies of external classes and JARs.">
    <delete file="jdom.jar" quiet="true"/>
    <delete file="xalan.jar" quiet="true"/>
    <delete file="xercesImpl.jar" quiet="true"/>
    <delete file="xml-apis.jar" quiet="true"/>
    <delete dir="./classes/com/arm/utilities" quiet="true"/>
  </target>
</project>

這個方法唯一的缺點似乎是Eclipse在調用外部構建器時不是100%完美,所以偶爾你必須在Eclipse中執行“Project> Clean ...”來強制它。

你有我的同情心。 我也與這個問題作斗爭,Eclipse開發的Wall-of-Silence開發了一個如此簡單明了的問題:如何從插件聲明一個依賴項到普通的Java項目(這樣它在運行時工作)?

我不認為他們支持它。 解決問題的唯一方法是在我的插件項目中創建文件夾,這些文件夾實際上是指向java項目的bin /文件夾的鏈接,然后將這些文件夾包含在插件中。 這至少有效,但由於需要絕對的文件系統路徑,它很脆弱。

也許你可以在Eclipse上使用“項目屬性” - >“部署程序集”,並將其他項目添加到主項目中。 其他項目看起來像“罐子”,自動添加到您的部署文件(戰爭,耳朵或其他)。 也許這可行。 至少它對我有用。 祝好運 !!

Ariesandes。

Build path屬性中有一個“鏈接源”選項,允許您為項目定義其他源文件夾。 您可以選擇另一個工作區項目的“src”文件夾,並將其重命名為“src2”或任何您想要的。 這樣,類被編譯並部署到插件項目輸出文件夾中,並且可以在運行時加載。

通過一組復雜的構建依賴關系,我發現Maven2和Hudson(用於CI)是一個非常好的組合。 設置基礎架構需要一段時間才能完成配置,但在此之后,它才起作用。

當然,您依賴於Maven2(或Hudson)對構建機制的支持。 我不確定Eclipse Headless構建的支持程度如何。 但是,如果您使用Eclipse無頭的唯一原因是允許依賴關系在一個地方表達,請自己幫忙並切換。

我遇到了完全相同的問題。 我們有一組可以由Maven構建的多個普通java項目,並且(當前)應該共享相同的類路徑以正常工作。 這些項目可用於在非OSGi環境中啟動服務器。 然后我們還有一個eclipse RCP客戶端,它將這些項目作為一個捆綁包使用。 我完全能夠使用Apache Felix Maven Bundle Plugin使用Maven構建這個大包,一切正常。 但每當我在正常項目中更改一個類時,我必須重建整個包。 增量構建和資源鏈接不起作用。

我嘗試了將這些項目中的二進制文件/源目錄鏈接到一個大包的Manifest類路徑中的“解決方案”,它似乎可以工作,但這將是一個真正的維護噩夢,因為我甚至必須鏈接一些單獨的文件。

具有諷刺意味的是,由於OSGi在客戶端的使用,我實際上正在考慮將我們漂亮的模塊化結構與Maven模塊合並到一個插件項目的子包中。 這是一個比開發速度極慢的更好的選擇。

我將首先調查的另一個更好的替代方案(根據OSGi人員)是將我的所有Maven模塊都變成OSGi包。 但這可能是一個真正的PITA,因為我依賴於類路徑掃描並組合來自多個包(有時是同一個名稱)的多個配置文件來形成一個配置。

(具體來說,我們使用Spring框架,並將多個persistence.xml文件合並到一個持久化上下文中。我們還合並了來自不同模塊的幾個spring XML上下文文件(都提供了不同的ASPECT),這些文件應該共同構成Spring要使用的一個Spring上下文-DM)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM