是否可以将所有 jar 依赖项打包到一个大 jar 中?

2022-09-03 16:27:17

我知道这不是“最佳实践”,但是我可以将所有依赖项包含在一个大jar中吗?


答案 1

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

下面尝试量化 One-Jar 对我的应用程序引入的性能影响。它是基于 Swing 的 GUI 应用程序,由 352 个类组成,这些类使用 ProGuard 4.5b2 进行了模糊处理。One-Jar 0.96用于将生成的类与价值12MB的库(ODFDOM,Saxon HE,Xerces,Jaxen,VLDocking,Apache Commons等)捆绑在一起。我已经比较了混淆罐的性能与One-Jar处理的相同罐子的性能。

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

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

希望它有帮助。


答案 2

我使用带有jar-with-dependencies描述符的maven assembly插件


推荐