maven找不到package/symbol

DevFeng 发表于 2021/12/25 21:48:26 2021/12/25
【摘要】 问题现象异常信息提示找不到package或symbol,例如:com/xxx/xxx/configserver/encryptor/xxx.java:[11,40] package com.sun.jersey.api.client.config does not exist原因分析分析日志可知,项目中引用了“com.sun.jersey.api.client.config”包下面的内容,但...

问题现象

异常信息提示找不到package或symbol,例如:

com/xxx/xxx/configserver/encryptor/xxx.java:[11,40] package com.sun.jersey.api.client.config does not exist

原因分析

分析日志可知,项目中引用了“com.sun.jersey.api.client.config”包下面的内容,但构建时无法从项目中以及所有解析出的依赖包中找到此包导致。导致此结果的原因一般有两大类:

  • 代码问题:代码中包引用不正确,此类问题较易排查,如有遇到可优先排查代码。
  • 环境/组件问题:依赖包损坏或不一致,此类问题常表现为本地可编译而云端构建失败;此章节主要为此类问题提供一些可能的解决方案。其中可能的环境/组件问题有:
    • 依赖包冲突
    • 依赖范围错误
    • 使用GAV模式上传依赖包
    • 依赖包损坏
    • 其他

依赖包冲突

部分场景下,因为操作失误或一些第三方依赖被动引入,项目中可能同时存在同一依赖的多个版本。同时引入不同版本可能会导致实际使用的版本与预期不符,进而导致找不到指定的包。处理此类问题操作步骤:

  1. 确认使用的依赖包版本,有两种方式可参考。


    1. 参考Maven定义的两个依赖调解原则:
      • 第一原则:路径最近者优先, 如:A->B->C->X(1.0)、A->D->X(2.0),则最终引用X版本为2.0。
      • 第二原则:第一声明者优先, 两个引入路径长度相同时,先引入的版本为最终版本。

    2. 使用dependency插件,在构建任务执行mvn dependency:tree查看。


  2. 如果确定构建使用的依赖与预期不符,导致构建失败,在pom最外层引入需要的依赖并重试:


    <dependencys>
    	<dependency>
    		<groupId></groupId>
    		<artifactId></artifactId>
    		<version></version>
    	</dependency>
    </dependencys>


  3. 如果步骤2仍不能解决问题,则进一步尝试其他解决方案。

依赖范围错误

使用Maven管理依赖时,Maven坐标中scope属性定义了依赖的有效范围。错误地指定依赖范围会导致该依赖在compile时无效,如果此时在项目主代码中使用了此依赖中的包,则会导致编译错误。处理步骤:

  1. 使用mvn dependency:tree查看项目使用的依赖及依赖范围。
  2. 对比依赖范围以及项目中使用依赖的位置。


    若在主代码中使用了依赖中的包,要求依赖在编译时有效,则要求依赖的范围为一下之一:

    • compile
    • provided
    • system:系统依赖范围必须通过systemPath指定依赖文件位置,切依赖文件必须存在于指定目录。


  3. 如果步骤2仍不能解决构建问题,则进一步尝试其他解决方案。

使用GAV模式上传依赖包

  • 在私有依赖仓库上传自研依赖包A时,如果选择GAV模式,只需要上传jar文件,系统会自动生成对应的pom文件;但是,此pom文件中只包含此依赖本身的坐标定义,原本的<dependencies>节点则会全部丢失。
  • 假设当前构建项目D,使用了项目A构建的依赖A,依赖A引入了第三方依赖B(D > A > B),此时,在构建D项目时,因为以上原因,Maven解析依赖A时,无法识别引入的依赖B,最终导致项目D中找不到依赖B的内容,遇到此场景时,可尝试按以下步骤排查:
  1. 查看项目D的依赖树,确定缺失的内容是否由项目A的pom文件引入,如果是则进入步骤2,否则请尝试其他解决方案。
  2. 从私有依赖仓库下载依赖A的pom文件,与项目A中pom对比,如果线上pom缺失了B依赖的引入,进入步骤3,否则请尝试其他解决方案。
  3. 更新依赖A的版本号并重新上传,此处提供两种解决方案:


    • 使用编译构建服务构建项目A,使用deploy命令将依赖A上传到Maven私有仓库(推荐:可集成于流水线中实现自动化)。
    • 在Maven私有仓库重新上传依赖A,此时选择POM模式,分别上传jar文件和pom文件。


  4. 更新完成后,尝试重新构建项目D。

依赖包损坏

依赖包损坏可能会导致依赖包中某些文件缺失,此时构建可以找到相应依赖包,但无法找到其中的class文件或者package,导致此类问题。此场景下可按包类型分不同方式处理:

  • 第三方依赖包:直接联系技术支持处理。
  • 自研(手动上传到Maven私有仓库)的依赖包,按如下步骤排查:
    1. 从Maven私有依赖仓库下载依赖包。
    2. 解压缩并查看依赖包内容是否正常。
    3. 若依赖包内容异常,再分两种情况排查:
      • 如果是第三方提供的包手动上传到maven私有依赖仓库,确认包文件无误并尝试重新上传(注意同时上传pom与jar文件)。
      • 如果是自己构建(本地/云端构建)的依赖包,且已确认代码无误,则检查是否是多任务同时构建导致构建生成jar包内容缺失
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。