Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 确定功能所需的最小jar数_Java_Frameworks_Jar - Fatal编程技术网

Java 确定功能所需的最小jar数

Java 确定功能所需的最小jar数,java,frameworks,jar,Java,Frameworks,Jar,如何确定框架的某个特性需要哪些JAR?例如,为了只支持依赖注入,Spring需要哪些JAR呢?这就是为什么一些旧的Java项目最终拥有600个JAR和一个200 MB war文件,用于一个10000行的应用程序。如果你不小心管理它,会有点痛苦…有些工具通过静态分析代码,然后创建一个只包含这些类的新JAR,从而找出应用程序中实际使用的类,从而创建最小的JAR。(我记得使用Zelix Classmaster可以做到这一点,但还有很多选择。) 在Spring这样的DI框架中使用这些工具的问题包括:

如何确定框架的某个特性需要哪些JAR?例如,为了只支持依赖注入,Spring需要哪些JAR呢?

这就是为什么一些旧的Java项目最终拥有600个JAR和一个200 MB war文件,用于一个10000行的应用程序。如果你不小心管理它,会有点痛苦…

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

在Spring这样的DI框架中使用这些工具的问题包括:

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

  • 现有的工具通过创建一个新的输出JAR来工作,而不是告诉您哪些输入JAR没有被使用。如果您是从封闭源代码库创建收缩包装的应用程序,那么重新打包JAR是可以的,但这通常是不可取的,并且在某些开源许可证中可能存在问题。当然你不想用Spring来做这件事

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

在我看来,更实际的选择是:

  • 如果您使用Maven/Ivy来管理依赖关系,请查看依赖关系图,去掉看起来不再需要的依赖关系。。。测试,测试,测试
  • 手动取出似乎未使用的罐子。。。测试,测试,测试
  • 别担心。适度的未使用JAR积垢可能会增加部署和webapp启动时间的一秒或三秒,但这通常并不重要。(但如果确实如此,请参见上文。)

您应该询问框架提供商或阅读文档。在某些情况下(动态加载),静态分析所需的jar可能不够,有时可能会导致jar太多


我曾经对一种“实用程序”库做过一些ftp助手的工作。它依赖于一些apacheftpjar。如果您从未使用过库中的ftp功能,那么您就不需要ftp jar,但是对代码的静态分析可能会说您需要它。这是您应该记录的内容。

测试,测试,测试。但通常情况下,如果框架说它需要所有的JAR,那么最好提供所有的JAR,否则就只能靠自己了。Spring就是一个例子。几乎所有它的第三方依赖项在Maven POM中都标记为可选。我同意测试是这方面的“包罗万象”,但这是一个好问题——我经常希望有一种方法在运行时知道实际使用了哪些库。我使用了一个Java提前原生编译器——它记录了所有使用的类和它们来自的JAR。您可以使用自定义类装入器模拟类似的情况,该类装入器跟踪装入的类,并使用class.getResource()确定位置。是另一个可以做到这一点的例子(甚至更多)。@BalusC-毫无疑问还有其他值得一提的例子。但不幸的是,他们并没有真正解决这个问题。我指的是第1段:)在您编辑中的实用备选方案之前,我完全同意(+1)。