Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在运行时防止Java编译时异常?_Java_Maven_Runtime Error - Fatal编程技术网

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

如何在运行时防止Java编译时异常?,java,maven,runtime-error,Java,Maven,Runtime Error,在运行时的项目中,我不时会遇到异常,例如NoSuchMethodError或NoClassDefFoundError。项目由Maven生成,没有任何警告。 调查显示,出现这种情况是因为我的项目中有直接依赖关系,需要我直接使用的库的不同版本。因此,依赖关系树可能如下所示: <exclusions> <exclusion> <artifactId></artifactId> <groupId>

在运行时的项目中,我不时会遇到异常,例如
NoSuchMethodError
NoClassDefFoundError
。项目由
Maven
生成,没有任何警告。
调查显示,出现这种情况是因为我的项目中有直接依赖关系,需要我直接使用的库的不同版本。因此,依赖关系树可能如下所示:

<exclusions>
     <exclusion>
          <artifactId></artifactId>
          <groupId></groupId>
     </exclusion>
</exclusions>
  • 我的大学项目1.0
    • apache http客户端4.2.0
    • cxf 2.6
      • apache http客户端4.1.0
或者像这样:

<exclusions>
     <exclusion>
          <artifactId></artifactId>
          <groupId></groupId>
     </exclusion>
</exclusions>
  • 我的大学项目1.0
    • apache http客户端4.2.0
      • apache commons编解码器1.9
    • struts 2.3
      • apache commons编解码器1.4
我通过寻找冲突依赖项的公共兼容分母修复了这些问题。但这只是在我在生产中出错之后

因此,问题是如何防止此类错误蔓延到生产构建中

我有一些解决方法:

  • 不要直接依赖于库,如果您已经有了它的可传递版本。因此,在依赖树1的情况下,我将删除ApacheHTTP客户端4.2.0,并开始使用ApacheHTTP客户端4.1.0。我可能需要修改代码来实现这一点,但对我来说似乎没问题。或者,我可以将CXF更新到一个使用ApacheHTTP客户端4.2.0的新版本,并从pom.xml中删除对ApacheHTTP客户端4.2.0的直接依赖。如果CXF团队对ApacheHTTP客户端所做的每一个不兼容的更改都是这种情况,我会注意到:我自己的代码无法编译。 不知道如何将这种方法用于依赖树2

  • 使用/扩展一些静态分析工具来检测缺少的方法或类。让我烦恼的是,我找不到做这种工作的工具。由此得出结论,我的问题还有其他解决办法。否则会有人创造出这样的工具

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

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


  • 这些方法对我来说似乎都不完整。你用什么方法?如何解决此问题?

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

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


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

    您可以尝试插件。这可能过于谨慎,但值得一试。

    它将禁止在pom.xml内声明依赖项的嵌套依赖项~尝试使用我上面提到的链接了解它~是的,如果您知道存在冲突,并且您知道冲突库的正确版本,则依赖项排除是一种解决方案。我的问题更多的是关于如何找出您有冲突,并找出满足所有其他人的冲突库的版本。例如,如果我添加了新的具有深度依赖关系树的第三方库,我如何检测冲突。我如何为两个依赖于公共第三方库的第三方库选择版本?@dan:不幸的是,最后一个问题没有通用的解决方案。@OliverCharlesworth同意,自动解决冲突是不可能的。但似乎检测是可能的。因为在您成功构建项目之后,出现编译时错误是很奇怪的。@dan:嗯,这是一个运行时错误。这可能是由于一个类在编译时在库的版本中可用,但在运行时在类路径上结束的库的版本中不可用。Java中不存在“编译时异常”。