maven打jar包指定要编译的资源文件很重要

最近在使用dubbo的时候遇到一个问题,在加载自定义扩展的Filter的时候,报错:No such Filter found in ... 大致意思就是说没有找到Filter对应的类com.cn.xxxFilter。并且这个错误只有在测试环境发生,开发环境并没有这个错误。刚开始以为是不是com.cn.xxxFilter.java没有被编译为class。后来查看测试环境打的jar包,发现有com.cn.xxxFilter.class。并且com.alibaba.dubbo.rpc.Filter 文件中也有配置 xxxFilter=com.cn.xxxFilter 。心里一万只草泥马飘过。后来查看dubbo源码跟踪到 报这个错误的代码处。发现dubbo在解析<dubbo:provider filter="xxxFilter">时会实例化 xxxFilter,通过反射构造com.cn.xxxFilter类的实例。我意识到可能是com.cn.xxxFilter在类加载的时候出错。回过头来看看com.cn.xxxFilter的代码。由于是在类加载阶段出的错,所以我很关心 静态代码块,以及静态属性。查看代码发现在com.cn.xxxFilter中我写了一个静态代码块加载 一个properties文件,回过头来查看测试环境打的jar包。并没有找到这个properties文件。终于找到问题所在了。但是为什么开发环境没有报这个错呢?原来这个properties文件我是放到src/main/scripts文件夹下面的。当初新建这个文件夹的时候是用eclipse新建的 一个resource文件夹及定义了src/main/scripts是一个资源文件夹。因此在本地开发的时候,com.cn.xxxFilte的静态代码块并不会找不到这个properties文件。但是在测试环境,发布maven打的jar包时maven并不知道,你的src/main/scripts文件夹是资源文件,所以需要在maven编译时指定 资源文件。

置于如何解决这个问题,很简单,因为我是用maven构建的项目。在maven的pom.xml中加入下面的代码

<build>
      <resources>
        <resource>
            <directory>src/main/scripts</directory>
            <excludes>
                <exclude>*.properties</exclude>
                <exclude>*.xml</exclude>
             </excludes>
            <filtering>false</filtering>
        </resource>
    </resource>
</build>

这是一个很隐晦的错误。因为类加载失败导致Filter找不到所以报错No such Filter found in ... 

我想吐槽的是dubbo应该在加载这些extension类时,在类实例化的时候,如果类实例化失败并没有打印相应的Log,也没有抛异常。

解决了这一个坑也算是增长了一些经验吧。以后再遇到  No xxx.class found 这类的错误时,首先考虑是不是java文件没有被编译为class文件。其次如果有class文件就应该考虑 是不是通过class实例化类的时候出错了,此时应该重点关注静态代码块以及静态属性的赋值。

猜你喜欢

转载自blog.csdn.net/qq_34310242/article/details/80012219