2011-08-05 65 views
2

我有一個用Eclipse構建的可執行jar文件(A.jar),它依賴於jar中包含的其他jar文件(B.jar)文件,並通過jarinjarloader訪問。雖然這用於訪問這些jar文件中的java代碼,但是當代碼調用時,它無法找到B.jar中包含的屬性文件。代碼在Eclipse中運行時工作,所以我知道正確的屬性文件在那裏。試圖從另一個jar文件中的jar文件中獲取屬性文件

我嘗試瞭解壓縮A.jar,然後解壓縮B.jar,然後壓縮組合文件,但這不起作用。看看Manifest文件,Main-Class是org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader

是否可以對Manifest文件進行一些更改(比如向Rsrc-Class-Path添加一些內容)會得到這個工作? Rsrc-Class-Path已包含「./」,但顯然不會讓屬性加載器看到我的屬性文件。

TIA,

格雷格

+0

啊,讓IDE管理構建的危險。你需要使用jarinjarloader嗎? – Paul

+0

如果你能告訴我另一種方法來構建一個包含大約15個不同的其他jar文件的可執行jar文件,我很高興聽到它。缺席,是的,我需要使用jarinjarloader。 –

+0

你需要提供一個罐子嗎?如果是這樣,C. Ramseyyer的回答是一個很好的答案。那裏也看到我的評論。 – Paul

回答

1

原來Eclipse有一個設置我錯過了。當導出 a「可運行JAR文件」您可以選擇「將所需的庫提取到生成的JAR」。雖然這可能會給一些許可證問題(取決於你合併的JAR),在我的情況下,它像一個魅力,給我一個單一的(更小,因爲有很多重複的jar文件之間我想包括)實際工作的罐子。

2

我也建議工作圍繞嵌套的罐子。我通常只是做這在我的build.xml建立一個罐子解壓到它的所有庫:

<target name="fatjar" depends="compile"> 
    <jar destfile="${isamjar}" filesetmanifest="mergewithoutmain"> 
      <manifest> 
        <attribute name="Main-Class" value="com.xyz.Main"/> 
        <attribute name="Class-Path" value="."/> 
      </manifest> 
      <fileset dir="./bin"/> 
      <fileset dir="." includes="src/**"/> 
      <zipfileset excludes="META-INF/*.SF" src="${l}/derby.jar"/> 
      <zipfileset excludes="META-INF/*.SF" src="${l}/jconn3.jar"/> 
      <zipfileset excludes="META-INF/*.SF" src="${l}/log4j-1.2.9.jar"/> 
      <zipfileset excludes="META-INF/*.SF" src="${l}/${jar4j}"/> 
    </jar> 

+0

還有[One-JAR](http://one-jar.sourceforge.net/),這是一個開源項目,「...提供自定義類加載器,它知道如何從存檔中的jar加載類和資源,而不是從文件系統中的罐子中。「 – Paul