2011-09-06 251 views
1

我的項目有很多依賴,我從其他項目引用。我現在正在編寫build.xml文件,目前正在編寫JAR任務。我想我會從大膽的假設開始,如果我期望我的JAR在Eclipse之外正確行爲,那麼我需要在JAR文件中包含每個引用的JAR依賴項的副本。與螞蟻JARring

因此,我現在需要在jar任務下添加fileset,以指示Ant將這些依賴關係包含在JAR中。問題是,當我切換到Navigator View並嘗試在我的項目中查找我的依賴項時,我找不到它們!唯一引用它們的是.classpath文件,該文件引用了它們的絕對URL,我假設它是Eclipse如何找到它們的。

所以我的問題是,我如何指示Ant在此.classpath文件中查找依賴項並將它們包含在我的JAR中?

我擔心的是我必須先將每個JAR手動複製到項目根目錄下的一個目錄中,然後在構建中簡單地引用該目錄。但是有一個很多JAR的,這意味着很多副本損失copy-n-pastin'。

對於Ivy或Maven請不要有任何建議,我很清楚這些是針對我的情況的最佳解決方案,但由於此問題範圍之外的原因,它們不可行。

感謝您的任何幫助。

+0

首先我打破你的任何構建和eclipse項目之間的依賴關係。這聽起來像你需要爲應用程序的運行時類路徑維護一組第三方jar。我只會在你的jar文件中包含你自己的源代碼類,然後定義第二個ant目標,爲你的應用程序構建運行時類路徑。 – emeraldjava

+0

謝謝你的建議! – IAmYourFaja

回答

0

你想讓你的項目產生一個可執行的jar文件,還是將其作爲一個可分解包的一部分被提取並運行?如果它不是您需要的可執行jar,那麼您應該創建一個jar,其中只包含項目中的類和資源,而不包含任何依賴jar。然後,如果您想要將項目作爲可分發軟件包發佈,則可能會創建一個包含依賴關係的zip和tar.gz。

我不知道自動同步Ant和Eclipse .classpath文件之間的文件集。除了編寫你自己的工具,我已經看到過。所以手動複製罐子可能是最快的解決方案。

0

您可以將項目從Eclipse中導出爲Ant構建文件(右鍵單擊項目,單擊「導出」,選擇「Ant構建文件」)。導出的build.xml文件將包含一個名爲<your project name>.classpathpath元素。 path元素將包含構建應用程序所需的所有jar的路徑。由於您要使用fileset,因此您可以修改生成的build.xml以重複使用path

讓Ant使用Eclipse的類路徑的唯一方法是編寫Ant,以便解析.classpath文件。

作爲一個便箋,我不建議嘗試將罐子放在罐子裏面。 Java不能從jar中的jar中加載類(除非你自己編寫類加載器來做到這一點)。如果您絕對需要,您可以使用zipfileset。但是,正確的解決方案是在分發應用程序時,將第三方JAR包裝在應用程序的jar文件之外。然後設置類路徑屬性在MANIFEST.MF文件中引用的文件的路徑(你可以從上面重用<your project name>.classpath的MANIFEST.MF。

0

我覺得複製粘貼&是最小的問題,如果你有如此多的依賴關係,主要問題是在開發過程中你不再是模塊化和靈活的。儘量減少它們,只保留必要的依賴關係。爲此,您可以使用例如Jdependmetrics或者 - 都具有Eclipse插件(或Class Dependency Analyzer)。

剩下的依賴關係可以放在一個jar文件中(也就是所有的類文件,不是嵌套的jar文件),這可能會讓某些人感到舒服,或者每個文件都在一個單獨的文件中,這是比較常見的對於用戶可能已經擁有的第三方庫尤其有用。

我的觀點是:模塊化對於開發和部署都很好。

0

您可以聲明相關的JAR路徑標記,然後將其用作對類路徑的引用。例如,

<project basedir="." default="build.all" name="My Application"> 
<path id="myclasspath"> 
     <pathelement location="${project.syslib}/log4j-1.2.8.jar"/> 
     <pathelement location="${project.syslib}/xalan.jar"/> 
     <pathelement location="${project.syslib}/common.jar" /> 
     <fileset dir="${config.common}/taglib"> 
      <include name="**/*.jar"/> 
      </fileset> 
     <fileset dir="${config.csr}/taglib"> 
      <include name="**/*.jar"/> 
      </fileset> 
</path> 
<target name="compile" depends="prepare" > 
    <javac srcdir="${project.root}/src" 
     destdir="${project.root.build}" 
     classpathref="myclasspath" 
     nowarn="yes" 
     debug="on" 
     fork="yes" 
     memoryInitialSize="80m" 
     memoryMaximumSize="256m" 
    /> 
</target> 
</project> 

此外,在Eclipse中如果添加罐通過添加罐按鈕,然後它使用相對路徑。