我有一个拥有一百万个罐子的项目(好吧,很多)。他们是由maven来找我的,我只使用了一小部分功能。为了清洁起见,我想知道我可以不用的罐子。
我的第一个想法是使用代码覆盖工具运行程序,然后找到被触摸的类。
以前有人这样做过吗?或者是否有更聪明的技巧来实现同样的目标?
答案 0 :(得分:4)
您可以使用-verbose:class
VM选项运行项目。这将打印从中加载它们的所有已加载类。使用一些智能解析app / grep / regexp将允许您将jar名称过滤为一组唯一条目,并告诉您使用了哪些。
我认为这会更容易,因为它会自动告诉你是否使用了一个类,如果是这样的话。
当然,这个和代码覆盖的问题在于你可能会删除一个仅在某些例外情况下使用的jar,但如果你删除了一个或两个太多,你的编译器会抱怨你(通常不是太复杂)找到班级所在的罐子的任务。
使用linux时可能的建议:
java -verbose:class <your startup command here> | grep "\[Loaded" | grep -o "from .*\]" | cut -c 6- | sort | uniq
如果您不使用linux,则保存到文件,获取Linux机器并在Linux上运行(或使用某些东西在Windows上运行bash命令)
答案 1 :(得分:0)
考虑使用已存在的工具,例如Dependency Finder或JDepend。
与所有静态分析工具一样,使用反射或DI框架可以将其抛弃;我已经使用自定义工具来使用这个和其他输入来解决问题,尽管它仍然是静态的。
对于完整的运行时使用信息,您可以使用Thirler的解决方案,尽管它是否完整可能取决于遵循的代码路径。
答案 2 :(得分:0)
您可以使用Maven Dependency Plugin
来分析依赖关系树。它还会建议您下载/添加到项目中的dependecies,因为它们依赖于任何其他jar。
运行mvn dependency:tree
并查看您是否使用了少量不需要的罐子。