Java jar文件中存在大资源的缺点?

4
有没有什么特定的缺点,将大型资源文件嵌入部署的Java jar文件中?(当然,忽略空间、带宽和其他简单问题,因为会导致jar文件大小增加。)
也就是说,将大型资源文件放置在jar文件中是否会使类加载变慢,在JVM内占用更多内存,或者出现其他类似的问题?
Jar文件基本上只是一个zip文件,并且应该有一个中央目录,因此不应该扫描整个文件以加载存档中的特定文件。我认为jar类加载器只会加载需要的文件,而不是文件中的所有内容,但我可能错了。

一些框架实际上正在扫描整个JAR文件。但是它们通常只关注*.class文件。我能想到的唯一缺点是在JAR操作方面——应用程序(重新)部署需要更长时间,更改资源需要重新部署JAR文件。 - Pavel Horal
@PavelHoral 是的,如果你有一个软件发布流程来限制外部更改,那么更新这些东西也会有一定的障碍。我主要是想确定如果将大量资源塞入jar文件中,Java是否存在基本的效率问题。如果使用ZIP文件的中央目录而不是扫描文件并查看各个本地文件头,则扫描整个JAR文件仍应相对较快。(基于后者的原因,似乎强烈不鼓励这样做。) - Alan Krueger
1
如果存在基本效率问题 - 我不这么认为。 - Pavel Horal
1个回答

4

类是按需加载的。对于普通的JAR文件,很少有东西被急切地加载(除非在清单中有特定的条目,我有点生疏,但大多数人不使用它们)。JVM根本不会在内存中缓存非类资源,因此从JAR文件中读取资源基本上与手动从普通ZIP文件中读取条目相同。我看到的唯一的缺点是:

  1. 每次复制JAR文件时都会复制资源,即使它没有改变,以及
  2. 从JAR文件中读取资源(已经压缩),即使是像图像这样已经压缩的东西。

我认为ZIP文件支持逐个文件的压缩算法,并支持无操作的压缩算法,所以第二点可能并不重要。


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