如何在运行时阻止Java编译时异常?

时间:2014-12-13 20:02:53

标签: java maven runtime-error

我不时会在运行时的项目中获得NoSuchMethodErrorNoClassDefFoundError等异常。项目由Maven建立,没有任何警告 调查显示这些是因为我在我的项目中直接依赖,需要不同版本的库我也直接使用。依赖树可能看起来像这样:

  • my_project 1.0
    • apache http client 4.2.0
    • cxf 2.6
      • apache http client 4.1.0

或者像这样:

  • my_project 1.0
    • apache http client 4.2.0
      • apache commons codec 1.9
    • struts 2.3
      • apache commons codec 1.4

我通过寻找冲突依赖的共同兼容分母来解决这些问题。但这只是在我生产出错之后。

所以问题是如何防止这类错误蔓延到生产构建中?

我有一些想法如何解决这个问题:

  1. 如果您已经拥有它的可传递版本,请不要直接依赖于库。因此,在依赖树#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中使用这种方法。

  2. 使用/扩展一些静态分析工具来检测缺少的方法或类。困扰我的是我无法找到完成这种工作的工具。它得出结论,我的问题还有其他一些解决方案。否则有人会创造这样一个工具。

  3. 彻底改变我的构建方法。从源代码构建所有内容(所有必需的库和我自己的项目)。编译器将负责检查缺少的方法和类。

  4. 编写测试。似乎是一个好方法。但是很难预测应该测试哪些流程(例如,在生产远程服务器中可以使用我不知道的某种编码方案进行响应)并且测试所有流程似乎不切实际,因为基本上您正在重写库的测试。

  5. 这些方法对我来说似乎都不完整。你用什么方法?你是如何解决这个问题的?

2 个答案:

答案 0 :(得分:0)

您可以在依赖项中使用排除标记,如下所示:

<exclusions>
     <exclusion>
          <artifactId></artifactId>
          <groupId></groupId>
     </exclusion>
</exclusions>

看一下这个链接 - &gt; link

然后在如何使用依赖项排除部分〜

答案 1 :(得分:0)

你可以试试Maven Enforcer插件。这可能过于谨慎,但值得一试。