我不时会在运行时的项目中获得NoSuchMethodError
或NoClassDefFoundError
等异常。项目由Maven
建立,没有任何警告
调查显示这些是因为我在我的项目中直接依赖,需要不同版本的库我也直接使用。依赖树可能看起来像这样:
或者像这样:
我通过寻找冲突依赖的共同兼容分母来解决这些问题。但这只是在我生产出错之后。
所以问题是如何防止这类错误蔓延到生产构建中?
我有一些想法如何解决这个问题:
如果您已经拥有它的可传递版本,请不要直接依赖于库。因此,在依赖树#1的情况下,我将删除apache http client 4.2.0并开始使用apache http client 4.1.0。我可能需要更改我的代码来执行此操作,但对我来说似乎没问题。或者我可以将CXF更新为更新的版本,它使用apache http client 4.2.0并从我的pom.xml中删除对apache http client 4.2.0的直接依赖。在这种情况下,CXF团队与apache http客户端进行的每次不兼容的更改,我都会注意到:我自己的代码将无法编译。 不知道如何在依赖树#2中使用这种方法。
使用/扩展一些静态分析工具来检测缺少的方法或类。困扰我的是我无法找到完成这种工作的工具。它得出结论,我的问题还有其他一些解决方案。否则有人会创造这样一个工具。
彻底改变我的构建方法。从源代码构建所有内容(所有必需的库和我自己的项目)。编译器将负责检查缺少的方法和类。
编写测试。似乎是一个好方法。但是很难预测应该测试哪些流程(例如,在生产远程服务器中可以使用我不知道的某种编码方案进行响应)并且测试所有流程似乎不切实际,因为基本上您正在重写库的测试。
这些方法对我来说似乎都不完整。你用什么方法?你是如何解决这个问题的?
答案 0 :(得分:0)
您可以在依赖项中使用排除标记,如下所示:
<exclusions>
<exclusion>
<artifactId></artifactId>
<groupId></groupId>
</exclusion>
</exclusions>
看一下这个链接 - &gt; link
然后在如何使用依赖项排除部分〜
答案 1 :(得分:0)
你可以试试Maven Enforcer插件。这可能过于谨慎,但值得一试。