将库提取和打包到jar文件中的区别

78

我想知道从Eclipse提取和打包库到jar文件的区别以及如何使用可运行的jar文件创建。

如果我的程序(可运行的jar文件)使用其他需要这些外部库(jars)的类,我应该选择什么?


可能是重复的问题:什么是可运行的JAR库处理选项之间的区别? - The Guy with The Hat
4个回答

55
如果你想将 jar 包放入生成的 jar 文件中,可以使用 packaging 方法。例如,如果你正在使用 Apache 库或其他第三方 jar 包,你可能希望保留这些 jar 包并放置在生成的 jar 中。在这种情况下,请使用 packaging。"将必需的库打包进jar文件"选项会将org.eclipse.jdt.internal.jarinjarloader包的类放入生成的文件中,并且该包位于生成的 jar 文件的根目录下。由于 Eclipse 的 jar 加载程序类,该选项还会创建一个大小更大的 jar 文件。
提取所需的库将导致按照包命名约定将第三方库的类放入您的 jar 文件中。例如,如果您打开 jar 内容,您会看到一些类在org.apache..包下。
这些 jar 文件的 MANIFEST.MF 文件中的主类条目不同:
当您打包所需的库时的主类条目:
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader

当你需要提取所需的库时,主类入口:

Main-Class: YourMainClass

5
那么包装有什么优势或用途呢? - Arian
2
通过打包,您可以通过“JarRsrcLoader”类将jar文件加载到生成的jar中。如果您正在使用第三方jar并希望将应用程序代码与这些jar组合在一起,则可以使用Eclipse的打包实用程序,如下所示。请参阅我的编辑答案。 - Juvanis
12
注意性能问题。直到昨天,我一直使用jarinjarloader将我的库jar包打包到我的应用程序jar包中。然后,在更新JRE到8版本31更新(Windows)后,执行我的应用程序变得非常慢(最多慢了10倍)。当我选择将库jar包的内容提取到我的jar包中时,问题得到解决。 - Giuseppe
肯定的是@Giuseppe,性能损失只会发生在类被加载时;一旦应用程序正在运行,就不应该有任何区别... - MikeW
1
@MikeW 这是你会想的,但我的应用程序在整个运行期间仍然慢了一个数量级,即使使用“package”。选择“extract”选项可以使性能更快。 - dminear
@dminear - 这很有趣,我认为有一些工具可以用来识别速度瓶颈 - 这肯定是技术上感兴趣的!也许缓存方式不同....但我认为尝试使用JVM设置可能有助于确定原因。 - MikeW

5
对我来说,最主要的区别是“打包”JAR文件被完整地作为一个独立的项目包含在内,因此保留了它们的版权信息和签名数据。
如果你选择“提取”,类文件将被从它们原来的上下文中拉出,并存储为您已经创建的文件,因此可能会违反一些许可条件,尽管在这种情况下最终JAR文件的大小会更小。Eclipse也会在这种情况下警告您有关许可证的问题。
因此,如果使用第三方JAR库,始终“打包”是专业的做法。

将项目转换为Maven,然后生成jar文件会提取或打包吗? - Fadi

0

尝试两种方式,并使用Zip程序打开生成的jar文件。非常有教育意义。


0

eclipse 中,主要有两种方法将项目导出为可运行的 jar 文件。

1). 将所需库文件打包进 jar 文件

  • 这种方式会将库文件的实际 jar 文件添加到您的 jar 文件中。 这是最干净的方式,因为它将应用程序类文件与库 JARs 分开。
  • 缺点是这会使可运行的 jar 文件执行非常缓慢。

2). 将所需库文件提取到生成的 jar 文件中

  • 这种方式只会从您的应用程序使用并包含在可运行的 jar 文件中的库中提取实际的类文件。 结果,您的 Jar 文件将包括您的应用程序类文件以及您的应用程序使用的所有库的类文件。

  • 这种方法使可运行的 jar 文件的执行效果就像在您的 eclipse IDE 中运行一样。


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