「maven」从一次 maven 排除问题中找到解决问题的方法论。

开发中遇到了报错该如何处理?

百度呀,google呀,都太泛化了,搜索出来的可能有很多个解决方法,但可能只有一种方法来解决你的问题。

解决访问的方法:找到错误信息,分析错误原因,逐一排除,最后便是答案。

一次解决错误的过程

找到错误信息

某一次 SpringBoot 项目启动过程中报错,没有任何日志,就程序结束了。

如何捕捉到错误,查看错误信息?如下:

try {

  SpringApplication.run(Application.class, args);

}catch(Exception e) {

  e.printStackTrace();

}

分析错误信息

发现是 "CLASS NOT FOUND" 错误,意思是类存在。

分析类找到到可能的原因:

  • (1)远程仓库中的 api 包中没有此类。

  • (2)本地 maven 仓库没有下载下来jar依赖

那么就从这两个方向入手:

  • (1)查看仓库中 jar 的位置,发现没有jar包,只有 *.lastUpdated 文件:由于网络或者其他原因导致jar包下载失败。

    • 解决问题:删除 *.lastupdated 文件后,重新导入包:mvn -U clean package

  • (2)查看远程仓库中的 jar 包,确认好版本号,发现是确实存在该类,排除原因(1)。

另外一次解决错误的过程。

错误是一层层抛出:查看最里面一层,就是最接近错误的地方。

2020-12-29 23:26:44.406 WARN  [AnnotationConfigServletWebServerApplicationContext:559][main]  - [TID: ] Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataBaseController': Unsatisfied dependency expressed through field 'taskBaseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'taskBaseMapper' defined in file [/Users/bjhl/IdeaProjects/taobao/taobao-web/target/classes/com/alibaba/m/web/dao/mapper/TaskBaseMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception; nested exception is org.springframework.core.NestedIOException: Failed to parse mapping resource: 'URL [jar:file:/Users/bjhl/.m2/repository/com/alibaba/m/m-individual-provider-dal/1.0.0-SNAPSHOT/m-individual-provider-dal-1.0.0-SNAPSHOT.jar!/mapper/individual/IndividualCrowdMapper.xml]'; 

nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'URL [jar:file:/Users/bjhl/.m2/repository/com/alibaba/m/m-individual-provider-dal/1.0.0-SNAPSHOT/m-individual-provider-dal-1.0.0-SNAPSHOT.jar!/mapper/individual/IndividualCrowdMapper.xml]'. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'com.alibaba.m.individual.provider.facade.bo.IndividualCrowdListBO'.  Cause: java.lang.ClassNotFoundException: 

Cannot find class: com.alibaba.m.individual.provider.facade.bo.IndividualCrowdListBO

Error parsing Mapper XML ,发现是解析 mapper 文件出错, 怀疑是mapper文件哪里写错了,找到这个mapper:IndividualCrowdMapper.xml,发现是SQL写错。

但是这是引用别人的 jar 包,为何会发生这种错误呢?

打开对方的 api 包,发现 api 包引用了几个模块,其中有个模块就包含 IndividualCrowdMapper.xml,但是自己的服务并不需要这个模块,api 包仅仅是引用一些服务的接口,并不会直接引用这个 xml 文件,所以果断排除这个依赖模块,仅仅引用 api 模块即可。(使用 idea 插件 Dependency Analyzer 工具查看依赖,并排除)

<dependency>
    <groupId>com.alibaba.taobao</groupId>
    <artifactId>taobao-provider-api</artifactId>
    <version>1.1.2-SNAPSHOT</version>
    <exclusions>
        <exclusion>
            <artifactId>taobao-provider-facade</artifactId>
            <groupId>com.alibaba.taobao</groupId>
        </exclusion>
        <exclusion>
            <artifactId>taobao-provider-dal</artifactId>
            <groupId>com.alibaba.taobao</groupId>
        </exclusion>
    </exclusions>
</dependency>


# 总结

解决问题的方法论:遇到问题不要胡乱猜测,一上来就依靠搜索引擎,要望闻问切:先去找到错误信息,分析错误可能的原因,逐一排查,最后解决错误。

上一篇:Vue(七)-- eslint


下一篇:CSS学习Day9之背景属性