2011-11-28 18 views
64

所以我將使用Java Web Start來部署Java應用程序。導出到Runnable Jar時,eclipse Helios中有三個選項。runnable jar庫處理選項有什麼區別?

  • 提取需要的庫文件到JAR
  • 包需要的庫文件到JAR
  • 複製所需的庫到旁邊的JAR子文件。

有什麼區別,它們將如何影響我的.jnlp文件?

如果它是一個單獨的jar,是不是更容易,因爲我不必寫所有不同的路徑到它使用的所有庫?

如果庫和應用程序都有變化,單個jar會是更好的解決方案嗎?或者我需要<jar href=''>爲每個單獨的庫?

另請注意,我需要使用.dll和.so文件等本機庫。

回答

115
  1. 提取需要的庫文件到JAR - 提取從庫應用程序使用的實際.class文件,並提出可運行的JAR內的.class文件。因此,可運行的JAR不僅包含應用程序的.class文件,還包含應用程序使用的所有庫的.class文件。

  2. 包需要的庫文件到JAR - 使實際JAR文件的庫到您可運行的JAR。通常,JAR文件中的JAR文件無法由JVM加載。但是Eclipse爲可運行的JAR添加了特殊的類來實現這一點。

  3. 複製所需的庫到下一個子文件夾,JAR - 保持庫JAR從運行的JAR完全分開的,所以可運行的JAR將只包含應用程序的.class文件。

選項#2是方便,因爲它整齊的一切打包成一個單一的JAR,並保持從應用程序的文件.class分離庫JAR。但是,在單個JAR(選項#1和#2)中打包所有內容的缺點是,如果更新應用程序,則用戶將不得不下載更多數據來更新應用程序。如果JAR保持獨立,那麼用戶只需下載包含應用程序代碼的JAR,而不是包含應用程序代碼所有庫代碼的單個大量JAR。

+0

+1謝謝,非常詳細的答案。 – KJW

+0

好奇,只是創建一個不可運行的jar文件呢?有什麼區別嗎? – KJW

+8

@KimJongWoo由於JAR在其「META-INF/MANIFEST.MF」文件中定義了一個main()方法的位置,因此您可以像執行「java -jar myjar.jar」一樣「執行」可運行的JAR。這個文件中的「Main-Class」設置定義了具有'main()'方法的類。 「普通」JAR往往沒有這個設置,所以你不能以相同的方式「執行」它們。 – Michael