Java 在pom.xml(commons-lang3)中省略必需的条目时编译失败

Java 在pom.xml(commons-lang3)中省略必需的条目时编译失败,java,maven,dependencies,Java,Maven,Dependencies,概述 这可能是一个无关紧要的问题,也可能没有资格出席,但任何建议都会有所帮助 当一个依赖项被添加到pom.xml中时,将一个项目编译成JavaJAR时会出现一堆错误,而代码没有任何变化 步骤 克隆项目的git repo并执行mvn clean compile [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] -----------

概述

这可能是一个无关紧要的问题,也可能没有资格出席,但任何建议都会有所帮助

当一个依赖项被添加到
pom.xml
中时,将一个项目编译成JavaJAR时会出现一堆错误,而代码没有任何变化

步骤

  • 克隆项目的git repo并执行
    mvn clean compile

    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 4.743 s
    [INFO] Finished at: 2018-05-31T22:21:04+00:00
    [INFO] Final Memory: 25M/389M
    [INFO] ------------------------------------------------------------------------
    
    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project saavn-storm-lib: Compilation failure: Compilation failure:
    [ERROR] /home/user/backend/storm/storm_lib/src/main/java/com/storm/bolts/Helper.java:[167,57] unreported exception org.json.JSONException; must be caught or declared to be thrown
    
    .
    
    .
    
    .
    
    .
    
  • 向同一项目的pom.xml添加新的必需依赖项

    多次出现与JSONException相关的错误消息,后跟

    [ERROR] /home/user/backend/storm/storm_lib/src/main/java/com/storm/bolts/Helper.java:[132,58] cannot find symbol
    [ERROR] symbol:   method unescapeJson(java.lang.String)
    [ERROR] location: class org.apache.commons.lang3.StringEscapeUtils
    
更多信息

  • pom.xml
    包含

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.3.2</version>
    </dependency>
    
  • 此方法在后续版本中已被弃用,但它在本版本中非常常见,并且到目前为止一直有效

问题

  • 既然没有修改代码,为什么这些代码一开始就没有显示出来,因为它们似乎已经存在了
  • JSONException
    相关的错误可以处理,但是为什么突然缺少一些依赖项,以及如何纠正

两种最可能的情况:

  • 在添加依赖项之前,已存在对不同版本的
    storm hive
    的依赖项。如果返回到工作状态(在添加依赖项之前)并调用Maven目标
    依赖项:list
    ,您可能已经在列表中看到了一个
    风暴蜂巢

  • 依赖项列表中有一个不同的依赖项,它与
    storm hive
    共享限定类名。如果在类路径上有同名的不同类,Java只会选择其中一个,这可能会导致奇怪的错误


  • 有了上面的指针,我又找了一点,却无意中发现了。这有助于解除封锁。但问题仍然是如何有效地识别导致问题的依赖关系?我在闲逛时使用了
    dependency:analysis
    dependency:tree
    。为什么需要排除?“依赖关系导致问题”是什么意思?我检查了与
    storm hive
    冲突的任何内容,但没有找到任何内容。那么,是否有可能由于这个特定条目而拉取的其他一些包可能会造成我所面临的问题呢?这就是我所说的导致问题的依赖关系,但我的意思是包。与前面的评论中建议的排除不同,只是将
    storm hive
    依赖关系作为顺序中的最后一个,同时在
    pom.xml
    中声明解决了问题。可能依赖关系管理是更好的解决方案
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.3.2</version>
    </dependency>
    
    ls -l ~/.m2/repository/org/apache/commons/commons-lang3/3.3.2/
    
    commons-lang3-3.3.2.jar
    commons-lang3-3.3.2.jar.sha1
    commons-lang3-3.3.2.pom
    commons-lang3-3.3.2.pom.sha1
    _remote.repositories