Java 确定功能所需的最小jar数
如何确定框架的某个特性需要哪些JAR?例如,为了只支持依赖注入,Spring需要哪些JAR呢?这就是为什么一些旧的Java项目最终拥有600个JAR和一个200 MB war文件,用于一个10000行的应用程序。如果你不小心管理它,会有点痛苦…有些工具通过静态分析代码,然后创建一个只包含这些类的新JAR,从而找出应用程序中实际使用的类,从而创建最小的JAR。(我记得使用Zelix Classmaster可以做到这一点,但还有很多选择。) 在Spring这样的DI框架中使用这些工具的问题包括:Java 确定功能所需的最小jar数,java,frameworks,jar,Java,Frameworks,Jar,如何确定框架的某个特性需要哪些JAR?例如,为了只支持依赖注入,Spring需要哪些JAR呢?这就是为什么一些旧的Java项目最终拥有600个JAR和一个200 MB war文件,用于一个10000行的应用程序。如果你不小心管理它,会有点痛苦…有些工具通过静态分析代码,然后创建一个只包含这些类的新JAR,从而找出应用程序中实际使用的类,从而创建最小的JAR。(我记得使用Zelix Classmaster可以做到这一点,但还有很多选择。) 在Spring这样的DI框架中使用这些工具的问题包括:
- 现有数据库仅跟踪静态依赖项。如果动态加载类,则必须明确地告诉分析器每个类的情况。DI框架,尤其是Spring充满了动态加载,包括对应用程序代码不透明的动态加载
- 现有的工具通过创建一个新的输出JAR来工作,而不是告诉您哪些输入JAR没有被使用。如果您是从封闭源代码库创建收缩包装的应用程序,那么重新打包JAR是可以的,但这通常是不可取的,并且在某些开源许可证中可能存在问题。当然你不想用Spring来做这件事
- 如果您使用Maven/Ivy来管理依赖关系,请查看依赖关系图,去掉看起来不再需要的依赖关系。。。测试,测试,测试
- 手动取出似乎未使用的罐子。。。测试,测试,测试
- 别担心。适度的未使用JAR积垢可能会增加部署和webapp启动时间的一秒或三秒,但这通常并不重要。(但如果确实如此,请参见上文。)
我曾经对一种“实用程序”库做过一些ftp助手的工作。它依赖于一些apacheftpjar。如果您从未使用过库中的ftp功能,那么您就不需要ftp jar,但是对代码的静态分析可能会说您需要它。这是您应该记录的内容。测试,测试,测试。但通常情况下,如果框架说它需要所有的JAR,那么最好提供所有的JAR,否则就只能靠自己了。Spring就是一个例子。几乎所有它的第三方依赖项在Maven POM中都标记为可选。我同意测试是这方面的“包罗万象”,但这是一个好问题——我经常希望有一种方法在运行时知道实际使用了哪些库。我使用了一个Java提前原生编译器——它记录了所有使用的类和它们来自的JAR。您可以使用自定义类装入器模拟类似的情况,该类装入器跟踪装入的类,并使用class.getResource()确定位置。是另一个可以做到这一点的例子(甚至更多)。@BalusC-毫无疑问还有其他值得一提的例子。但不幸的是,他们并没有真正解决这个问题。我指的是第1段:)在您编辑中的实用备选方案之前,我完全同意(+1)。