2009-07-27 52 views
20

我想重新構建我的構建技術,以創建依賴於常見的第三方jar文件的Java jar文件。 (GlazedLists,Apache Commons等)螞蟻,jar文件和類路徑哦我的

我一直把它們全部裝入{Java JRE dir}/lib/ext中,這樣它們會自動被JRE看到,但是這導致了像不記得我需要的問題分發某些jar文件,所以我想學習更明確。

所以我搬到他們都到C:\申請\ java的\ COMMON \,將它們添加到Eclipse的構建路徑,A和我的螞蟻文件中定義的:

<path id="javac_classpath"> 
    <fileset dir="${libDir}"> 
     <include name="*.jar"/> 
    </fileset> 
    <fileset dir="c:/appl/java/common"> 
     <include name="*.jar"/> 
    </fileset> 
</path> 

我有我Class-Path清單頭部設置爲「。」在我的jar任務中,但即使將相關的jar文件放入與我的應用程序jar文件相同的目錄中,這似乎也不起作用。我可以將它們全部手動添加到Class-Path頭部,但我想知道,是否有更簡單的方法來正確獲取Class-Path頭部設置?

回答

36

這就是你需要:

<path id="build-classpath"> 
    <fileset dir="${dist}/lib"> 
     <include name="*.jar"/> 
    </fileset> 
</path> 
<manifestclasspath property="lib.list" jarfile="${dist}/lib/myprog.jar"> 
    <classpath refid="build-classpath"/> 
</manifestclasspath> 
<jar jarfile="${dist}/lib/myprog.jar" 
    basedir="${build}" 
    includes="com/my/prog/**" > 
    <manifest> 
     <attribute name="Main-Class" value="com.my.prog.MyProg"/> 
     <attribute name="Class-Path" value="${lib.list}"/> 
    </manifest> 
</jar> 

正如你很可能會看到,它假定你已經編譯Java類,並將其輸出到${build}。它還假定您已將您的jar文件複製到${dist}/lib

也就是說,這將是值得研究的內置支持依賴項的其他構建系統,如Maven和Gradle。這些其他構建系統已經考慮了許多常見的項目結構和構建操作,因此您不必將所有內容編寫到最後的細節。

+1

ahhhh ...這就是我一直在尋找的東西。優秀! – 2009-07-28 13:38:02

0

出於安全原因,默認情況下,類路徑目錄不包含Jar文件。有人可以在這裏放置一個jar文件,並且可以在你不知情的情況下加載,覆蓋你的代碼。我知道有關於添加另一個標誌或結束標記以允許將Jar文件添加到類路徑中的討論,但是,如果我的內存服務於此,那麼將針對版本7提供。但是,在最後一部分我可能會出錯。

0

jar文件的類路徑清單標題要求您明確列出要包含的jar文件。 在類路徑中列出一個目錄意味着java將在該目錄中查找.class文件,而不是jarfiles。

4

你想要的是一個mapper。 Flattenmapper可能是最簡單的,但基本上你需要創建一個指定你的類路徑的路徑元素,然後使用它的路徑轉換將它變成一個可以包含在你的清單中的字符串。

編輯:您可以使用包括規則構建路徑元素,所以一切都在罐子結尾的目錄將是**/*.jar

-1

既然你在螞蟻的時候,你可能不希望進行切換,但Maven的非常擅長識別所有的依賴關係,並且有幾個工具可以將你的lib jar複製或合併在一起用於分發目的。爲了我的目的,我有一個Maven插件,它在構建過程中創建了一個運行腳本,這又爲我設置了類路徑,所以我不需要擔心它。

+0

常春藤是一個非常螞蟻兼容的方式做依賴管理。 – 2009-10-19 14:42:20

3

在ant 1.7之後,manifestclasspath任務是前進的方向。 如果您使用1.7版之前的ant版本,則manifestclasspath任務不存在。

下面給出了相同的結果: -

<path id="build.classpath"> 
    <fileset dir="${dist}/lib"> 
     <include name="*.jar" /> 
     <exclude name="myprog.jar" /> 
    </fileset> 
</path> 

<pathconvert property="lib.list" pathsep=" "> 
    <path refid="build.classpath" /> 
    <mapper> 
     <chainedmapper> 
      <flattenmapper /> 
     </chainedmapper> 
    </mapper> 
</pathconvert> 

<target name="generate.jar"> 
    <jar destfile="${dist}/lib/myprog.jar"> 
     <manifest> 
      <attribute name="Main-Class" 
       value="com.mypackage.MyClass" /> 
      <attribute name="Class-Path" value="${manifest.classpath}" /> 
     </manifest> 
    </jar> 
</target>