如何识别 Maven 项目中潜在的 java dependiny 命名空间冲突?

How to identify potential java dependiny namespace conflicts in maven project?

我现在正在处理几个巨大的遗留应用程序。经过数月的测试,我们终于完成了部署,结果却遇到了一个 "failed to load webapplicationcontext",这让整个努力付诸东流。该特定失败是由于两个传递依赖项之间的名称 space 冲突。即,两个罐子都有一个 class 加载为:org.something.somethingelse.ClassName.

通过 Maven 为这个项目引入了大约 100 个 jar。几个明确的,大多数传递的。理想情况下,我想知道我放在 class 路径上的每个罐子。但实际上,我没有足够的经验或时间来逐一检查潜在问题。

是否有工具、技术或eclipse/intelliJ 功能可用于扫描一组 jar 以寻找相似的名称space?

您可以尝试 enforcer plugin。在 Maven 项目中,当您需要检测不同版本的同一工件的不同 jar 依赖项时,它非常有用。

你也可以阅读this post

所以这里有几个不同的解决方案。我最终使用 jhades (http://jhades.github.io/) 来识别 war 中的冲突,然后使用 tattletale(由 JBOSS 支持提供的实用程序)来识别 war 和容器。

我向所有显式依赖项添加了 'exclude *' 标记,以防止加载任何传递依赖项。我为仍然不存在的任何内容添加了显式依赖项。在确保所有编译的依赖项都能正常运行后,我将 tattletale 标识的任何库设置为提供并将必要的模块添加到 standalone.xml。这些诸如 hibernate、apache 库、servlet API 等的东西

我发现的另一件事首先使它很难识别是 JBOSS 的类加载器根据托管文件系统对它们的排序方式对库进行索引。在 Windows,这是我们 90% 的开发工作,它们总是按字母顺序加载。在 linux,我们进行生产部署时,顺序是伪随机的。我们的生产服务器是从相同的映像构建的,因此 RHEL 3.4 服务器将以与另一个 3.4 相同的顺序加载,但 3.5 的加载顺序完全不同。因此,在我们部署到 3.6 服务器之前,我们没有看到失败。生产中。

希望这对某人有所帮助。