sqoop1使用java操作,打包运行出现“找不到符号错误”

sqoop1在ide中测试完全没问题,打包后运行springboot项目,然后就会报错,报的是Text找不到符号,就是sqoop生成的那个java文件,为什么阿?

问题描述太简单了,建议贴上代码和具体日志信息

这个错都是在MAVEN插件在编译的时候报的,所以问题一定是出在编译的环节上。

这个时候就要好好检查MAVEN的编译配置,

1、看看配置里的编译版本和本机环境上配置的java版本是否一致,有时候报错的类有可能是引用了另外另外一个MAVEN模块的代码,也要看看那个模块的版本配置编码是否一致。但这并不是一定的,有时候不一致也不会有问题,但这是一个可以注意的点。

例如下图情况:


org.apache.maven.plugins
maven-compiler-plugin
3.3

1.7
1.7
UTF-8


2、如果报错的类里面有引用了另外一个MAVEN模块的代码,那么在打这个模块的包之前,最好先编译打包一下那个要引用的MAVEN模块。

3、还有可能是编译插件版本的问题,例如刚刚上面的MAVEN插件配置,在出问题的时候可以尝试把版本调低或者调高,然后再编译试试。

4、还要看看编译插件里面是否还有引用了其它的插件,例如下面情况所示:


org.apache.maven.plugins
maven-compiler-plugin



org.mapstruct
mapstruct-processor
${mapstruct.version}




这里的编译插件还引用了mapstruct依赖,所以要检查一下这个引用的依赖版本是否有问题,可以尝试更换其它版本。

最近我遇到的一个问题就是出在这里。我的工程里面有一个DTO类,然后在另外一个impl类里面会调用这个DTO类某个属性的set方法,就是在编译这个impl类的时候,报了找不到符号,报错的位置就是这个set方法的位置。后来试了好多方法都不行,最后发现原来这是mapstruct的一个bug,如果我这个DTO类的getter和setter方法的顺序与属性的顺序不一致的话,就会编译失败。例如类里面的属性先是name,下一行就是age,再下一行就是habbit,那么getter,setter方法也要按这个顺序,先是name的getter,setter方法,然后再是age的getter,setter方法,等等。我就是有个组getter,setter方法顺序不对,所以编译出错了。这真的是非常坑。

所以用这些开源的插件,尽量用稳定版本,不然怎得非常坑。

5、简单粗暴地使用“Maven Update Project”,这个方法能解决大部分情况下的这个问题。