是否可以将所有jar依赖包装在一个大罐子里?

Geo*_*Geo 14 java dependencies jar

我知道这不是"最佳实践",但我可以将所有依赖项包含在一个大罐子里吗?

abb*_*abb 16

我的感觉是,将One-Jar的表现称为糟糕和糟糕的表现是不公正的.对于中等大小的应用程序,可以预期启动将花费几秒钟(尽管不会影响JVM启动画面).对于大多数环境,除了嵌入式系统之外,几十兆字节的内存开销可以忽略不计.此外,One-Jar能够自动将一些文件提取到文件系统,从而节省了在我的情况下开发安装程序的需要.

下面是尝试量化One-Jar对我的应用程序引入的性能影响.它是基于Swing的GUI应用程序,由使用ProGuard 4.5b2混淆的352个类组成.One-Jar 0.96用于捆绑产生的类,其中包含12MB的库(ODFDOM,Saxon HE,Xerces,Jaxen,VLDocking,Apache Commons等).我比较了混淆jar的性能和One-Jar处理的同一个jar.

  • 从JVM开始到main()方法的开始:没有One-Jar的0.5s和One-Jar的1.7s.从JVM开始到屏幕上应用程序窗口的出现:没有One-Jar的2.3s和带有One-Jar的3.4s.因此,One-Jar为启动时间增加了1.1秒.
  • One-Jar不会增加屏幕上出现的JVM启动和启动图像之间的延迟(如果通过jar清单实现),因此启动时间的增加对于交互式应用程序来说并不太烦人.
  • 我们讨论的是类加载器,因此除非您广泛使用动态类加载,否则不应对代码执行速度产生任何影响.
  • 查看JVM统计信息(通过jconsole)显示One-Jar'red版本需要更多堆内存.对于我的应用程序,开销大约为几十MB.我看到数据如16MB对40MB,306MB对346MB,131MB对138MB,这取决于应用程序正在处理的大量用户数据,现在很久以前垃圾收集器已被执行.

上面的时间是通过在从Linux shell启动JVM之前,在main()方法的开头和我的应用程序窗口的windowOpened()事件处理程序中获取时间戳获得的.测量是在速度不是特别快的D820笔记本电脑上进行的,双核1GHz CPU和运行Ubuntu 8.04的2G或RAM.

希望能帮助到你.


dfa*_*dfa 13

我使用maven程序集插件jar-with-dependencies描述符

  • +1.Maven对于照顾这类东西非常棒.但是我建议创建一个自定义程序集而不是使用默认的jar-with-dependencies,因为这样可以获得更好的结果.此外,值得注意的是,最新的程序集插件有点错误并添加了依赖项的多个副本,所以在修复之前我建议使用以前的版本. (3认同)

Vla*_*mir 9

使用好的旧Ant:只需使用zipgroupfilesetAnt Zip任务

<zip destfile="out.jar">
    <zipgroupfileset dir="lib" includes="*.jar"/>
</zip>
Run Code Online (Sandbox Code Playgroud)

这将使所有包含的jar库内容变得扁平化.

  • 我们应该如何处理jar文件中的多个Manifest文件? (2认同)

小智 6

One-JAR在启动时将所有依赖项jar加载到内存中.这可能听起来非常低效,但自2004年发布以来,没有人向我抱怨它.预加载的可能影响是应用程序的类加载的整体加速,因为类加载器不必重复扫描类路径对于应用程序运行的资源和类:所有内容都是哈希映射的.

构建一个可以按需加载的延迟加载器非常简单:但我是学校里面说的"构建它,测量它,改进它 - 如果有必要的话",到目前为止还没有必要改进它.

我将在未来的版本中考虑到这一点(或者如果其他人想要解决它,那也会很棒,因为没有非常大的应用程序来衡量,很难知道改变是否有改进).

  • 我会提到这一点,因为他没有:@simontuffs 是 One-JAR 的作者。 (2认同)

Dav*_*ebb 5

如果你想这样做,有一个名为Jar Jar Links的工具可以帮你完成.从未使用它,但很难忘记这个名字.

  • 双关语减去一百万 (5认同)

ska*_*man 2

有一个名为One-Jar 的实用程序可以满足您的需求,尽管我建议不要这样做。表现通常很糟糕。

  • 请详细说明糟糕的表现。我使用它,并希望得到反馈。 (2认同)