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

80

我将使用Java Web Start部署Java应用程序。在eclipse Helios中导出可运行的Jar包时,有三个选项:

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

它们之间有什么区别,会如何影响我的.jnlp文件呢?

如果只是一个单一的Jar包,是否更容易些,因为就不必写所有库文件的路径?

如果库文件和应用程序都有更改,那么单个Jar包会是更好的解决方案吗?还是我需要为每个单独的库文件添加<jar href=''>标签呢?

同时请注意,我需要使用像.dll和.so这样的本地库文件。

1个回答

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

  2. 将所需的库打包进JAR文件中 - 将库的实际JAR 文件放入您的可运行 JAR 文件中。通常情况下,嵌套在另一个 JAR 文件中的 JAR 文件无法被JVM加载。但是Eclipse会添加特殊的类到可运行的JAR文件中以使此操作成为可能。

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

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

然而,将所有内容打包到单个JAR文件中(选项#1和#2)的缺点是,如果您更新了应用程序,则用户必须下载更多数据才能更新应用程序。如果将JAR文件分开,则用户只需下载包含您的应用程序代码的JAR文件,而不是一个包含您的应用程序代码所有库代码的庞大的单个JAR文件。


好奇,那么创建一个不可运行的jar包有什么区别吗? - KJW
10
你可以通过这样的方式来“执行”可运行的JAR文件:java -jar myjar.jar,因为JAR文件在其“META-INF/MANIFEST.MF”文件中定义了main()方法的位置。该文件内的“Main-Class”设置定义了具有main()方法的类。通常,“普通”的JAR文件没有这个设置,所以你不能以同样的方式“执行”它们。 - Michael
1
@Michael,对于部署独立应用程序(无版本更新),选项1难道不是显而易见的选择吗?它似乎也是最简洁、占用最少字节的解决方案,是吧? - Pacerier
1
一个带有提取的JAR包在加载速度和执行方面是否比打包更快? - Developer66
1
@Developer66 我猜测任何性能差异都是微不足道的。 - Michael
我仍然不完全理解#1和#2之间的区别。 - derHugo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接