可运行的jar库处理选项之间有什么区别?


76

因此,我将使用Java Web Start部署Java应用程序。导出到Runnable Jar时,Eclipse Helios中有三个选项。

  • 将所需的库提取到JAR中
  • 将所需的库打包到JAR中
  • 将所需的库复制到JAR旁边的子文件夹中。

有什么区别,它们将如何影响我的.jnlp文件?

如果是单个jar,是不是更容易,因为我不必将所有不同的路径写入它使用的所有库?

如果库和应用程序中都进行了更改,那么单个jar将是更好的解决方案?还是我需要<jar href=''>每个单独的库?

另请注意,我需要使用.dll和.so文件等本机库。

Answers:


140
  1. 将所需的库提取到JAR中-.class从应用程序使用的库中提取实际文件,并将这些.class文件放入可运行的JAR中。因此,可运行的JAR不仅将包含.class您的应用程序文件,而且还将包含.class您的应用程序使用的所有库的文件。

  2. 所需的库打包到JAR中-将的实际JAR文件放入可运行的JAR中。通常,JVM无法加载JAR文件中的JAR文件。但是Eclipse在可运行的JAR中添加了特殊的类来实现这一点。

  3. 将所需的库复制到JAR旁边的子文件夹中-将库JAR与可运行JAR完全分开,因此可运行JAR仅包含.class应用程序的文件。

选项#2之所以方便,是因为它将所有内容整齐地打包到一个JAR中,并使库JAR与您的应用程序文件分开.class

但是,将所有内容打包在单个JAR(选项#1和#2)中的不利之处在于,如果您更新应用程序,则用户将必须下载更多数据来更新应用程序。如果将JAR保持分开,则用户只需下载包含您的应用程序代码的JAR,而不是下载包含您的应用程序代码所有库代码的单个大型JAR 。


很好奇,仅创建一个不可运行的jar怎么样?有什么区别吗?
KJW 2011年

9
@KimJongWoo您可以像这样“执行”可运行的JAR,java -jar myjar.jar因为JARmain()在其“ META-INF / MANIFEST.MF”文件中定义了方法的位置。该文件内部的“ Main-Class”设置定义了具有该main()方法的类。“普通” JAR往往没有此设置,因此您不能以相同的方式“执行”它们。
Michael

1
@Michael,很好,用于部署独立的应用程序(无版本更新),选项1不是显而易见的选择吗?这似乎也是最简单的解决方案,并且花费最少的字节数,对吗?
Pacerier 2014年

1
装有提取物的罐子比包装快吗?在加载速度和执行中
Developer66

1
@ Developer66我的猜测是任何性能差异都可以忽略不计。
迈克尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.