java - 确定功能所需的最少 jar

标签 java frameworks jar

您如何确定框架的某个功能需要哪些 jar 包?例如,为了仅支持依赖注入(inject),在所有可用于 Spring 的 jar 中需要哪些 jar?

最佳答案

有些工具可以通过静态分析代码找出应用程序中实际使用了哪些类,然后创建仅包含这些类的新 JAR,从而创建最少的 JAR。 (我记得使用 Zelix Classmaster 来做到这一点,但有很多选择。)

将这些工具用于像 Spring 这样的 DI 框架的问题包括:

  • 现有的仅跟踪静态依赖项。如果你动态加载类,你必须明确地告诉分析器每一个。一般的 DI 框架,尤其是 Spring 充满了动态加载,包括对应用程序代码不透明的动态加载。

  • 现有工具的工作方式是创建新的输出 JAR,而不是告诉您哪些输入 JAR 未被使用。如果您从闭源代码库创建收缩包装的应用程序,则重新打包 JAR 是可以的,但通常这是不可取的,并且对于某些开源许可证可能存在问题。当然,您不想使用 Spring 执行此操作。

理论上,有人可以编写一个工具来提供帮助。在实践中,该工具需要(例如)知道如何从以注释、XML 表示的 Spring 配置和从高阶配置在运行时创建的 bean 描述符中提取动态类依赖关系(例如,SpringSecurity 就是这样做的)。这是一个很大的问题。即使那样,您也会遇到这样的问题,即由于 JAR 修剪过程遗漏了所需的 JAR,对安装平台上的布线进行的“小”更改可能会失败。

在我看来,更实用的替代方案是:

  • 如果您使用 Maven/Ivy 来管理您的依赖关系,请查看依赖关系图,去除似乎不再需要的依赖关系......然后测试、测试、测试。
  • 手动剔除似乎未使用的 JAR...并测试、​​测试、测试。
  • 别担心。中等程度的未使用 JAR 垃圾可能会增加一到三秒的部署和 Web 应用程序启动时间,但这通常无关紧要。 (但如果确实如此……见上文。)

关于java - 确定功能所需的最少 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2796088/

相关文章:

javax.xml.bind.JAXBException : Class *** nor any of its super class is known to this context

java - GWT 应用程序中的静态资源

java - 什么时候使用 'java.util.Objects.*' ?

php - 适用于初学者的Laravel PHP框架

java - 我的 Java Hashmap 实现存在问题

php - Laravel Blade 布局

ios - 我应该如何使用命令行参数将框架文件拖放到 xcode 项目内的框架文件夹中。(终端)

java - 找不到创建可执行jar的主类

java - 在 IntelliJ 中构建工件

java - 如何转义作为参数传递给 java -jar 的字符串中的 < >?