java - 能不能把所有的jar依赖打包在一个大jar里?

标签 java jar dependencies

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

最佳答案

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

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

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

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

希望对您有所帮助。

关于java - 能不能把所有的jar依赖打包在一个大jar里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1059851/

相关文章:

java - 使用 libGDX 添加地面陷阱

java - 使用外部文件的空指针异常

java - Scala 和 Eclipse : Export as Jar File, 但找不到 main 方法

javascript - 使用 webpack 时,两个文件可以在 Javascript 中相互依赖吗?

dependencies - 使用依赖关系构建测试支持工件

dependencies - 如何在 setup.py 中包含 rpm 依赖项

java - REST 客户端 restTemplate 无法获取对象集合

java - 有没有什么方法可以从 Apache Camel 路由生成 bpmn 模式或带有模式的图片?

android - 从gradle文件中的jar中排除lib

java - 我应该将循环作业作为 CRON 还是使用 Java 构建的 JAR 来运行?