【问题标题】:Find duplicated classes in classpath在类路径中查找重复的类
【发布时间】:2012-09-14 05:27:46
【问题描述】:

我有一个用 Maven 构建的 Java 应用程序,它有很多依赖项。在执行我的测试用例时,它们有时会通过,有时会因为一些不兼容的类组合而失败。因此,在类路径中似乎必须有一些类是随机抽取的。一个好一个不行。

  • 如何找出我的类路径中哪些类/jar 不兼容?
  • 什么是使用 Maven 以免落入兼容性陷阱的正确方法?

【问题讨论】:

  • Maven怎么知道? OSGi 就是答案....
  • 独立工具Tattletale是一个不错的选择,我个人使用progurad作为一站式解决方案,因为它更容易与Maven集成。

标签: java maven


【解决方案1】:

您可以尝试使用此工具Tattletale

【讨论】:

【解决方案2】:

您可以使用 maven dependency:tree 查看项目的 maven 层次结构和 maven exclusion 排除你不想要的罐子

【讨论】:

  • 这不显示任何类,而只显示模块依赖关系。
【解决方案3】:

我认为更好的解决方案是使用maven-duplicate-finder-plugin

注意:新版本是duplicate-finder-maven-plugin

【讨论】:

  • 这对我来说就像一个魅力!无需设置,无需编辑pom.xml,只需从命令行调用mvn com.ning.maven.plugins:maven-duplicate-finder-plugin:1.0.4:check
  • 有与此插件等效的 Gradle 吗?
  • 仅供参考,这里有类似的东西:mojohaus.org/extra-enforcer-rules/banDuplicateClasses.html
  • 最新版本的命令行是mvn org.basepom.maven:duplicate-finder-maven-plugin:1.4.0:check
  • @Renato 不存在等效项。我准备了自己的 gradle 插件,它从 github.com/tehlers/gradle-duplicate-classes-check/blob/master/… 扩展而来,但有显着差异:1)仅检查 runtimeClasspath 依赖项 2)还检查当前项目源文件
【解决方案4】:

eclipse中有一个插件可以检查构建路径中的重复类(ClasspathChecker http://classpathchecker.free.fr/

【讨论】:

    【解决方案5】:

    这是另一个简单的开源重复类路径查找工具 - Classpath Inspector

    它给出了类路径中重复类的相当不错的报告。

    【讨论】:

      【解决方案6】:

      这个问题基本上是更一般的问题“以某种方式扫描类路径(CP)并收集所有类文件和其他资源”的应用,然后在其中找到重复项......

      a number of existing libraries for CP scanning(在所有环境中正确执行此操作并非易事,特别是因为Java 9 中的应用程序类加载器不再是URLClassLoader),尤其是Classgraph, using which it's relatively trivial to do this

      PS:对于 Java 版本 JHades (jhades.github.io) 很好(但 NOK on Java 9/10/11)。

      【讨论】:

        【解决方案7】:

        您可以使用ClassGraph 检测类路径或模块路径中重复的类文件定义(免责声明,我是 ClassGraph 的作者):

        for (Entry<String, ResourceList> dup :
                new ClassGraph().scan().getAllResources().classFilesOnly().findDuplicatePaths()) {
            System.out.println(dup.getKey());              // Classfile path
            for (Resource res : dup.getValue()) {
                System.out.println(" -> " + res.getURI()); // Resource URI, showing classpath element
            }
        }
        

        【讨论】:

        猜你喜欢
        • 2015-12-24
        • 2012-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多