背景
? ? ? ? 开发flink程序,引入了Hadoop-hdfs相关包用于访问hdfs,程序开发完成后,本地测试无任何问题,提交上线,运行jar提示如下错误:
java.lang.NoSuchMethodError: org.apache.commons.cli.Option.builder(Ljava/lang/String;)Lorg/apache/commons/cli/Option$Builder;
at org.apache.flink.runtime.entrypoint.parser.CommandLineOptions.<clinit>(CommandLineOptions.java:27) ~[flink-dist_2.12-1.12.1.jar:1.12.1]
at org.apache.flink.runtime.entrypoint.ClusterConfigurationParserFactory.options(ClusterConfigurationParserFactory.java:42) ~[flink-dist_2.12-1.12.1.jar:1.12.1]
at org.apache.flink.runtime.entrypoint.ClusterConfigurationParserFactory.getOptions(ClusterConfigurationParserFactory.java:50) ~[flink-dist_2.12-1.12.1.jar:1.12.1]
at org.apache.flink.runtime.entrypoint.parser.CommandLineParser.parse(CommandLineParser.java:42) ~[flink-dist_2.12-1.12.1.jar:1.12.1]
at org.apache.flink.runtime.util.ConfigurationParserUtils.loadCommonConfiguration(ConfigurationParserUtils.java:135) ~[flink-dist_2.12-1.12.1.jar:1.12.1]
at org.apache.flink.runtime.taskexecutor.TaskManagerRunner.loadConfiguration(TaskManagerRunner.java:352) ~[flink-dist_2.12-1.12.1.jar:1.12.1]
at org.apache.flink.runtime.taskexecutor.TaskManagerRunner.runTaskManagerSecurely(TaskManagerRunner.java:367) [flink-dist_2.12-1.12.1.jar:1.12.1]
at org.apache.flink.runtime.taskexecutor.TaskManagerRunner.main(TaskManagerRunner.java:348) [flink-dist_2.12-1.12.1.jar:1.12.1]
原因分析
? ? ? ? 引用缺失,如字面含义:未找到对应的方法,可能是引用的类无该方法,查看编译好的class文件,org.apache.commons.cli.Option.builder 的class文件存在,可排除缺失引用。
????????jar包冲突
推荐个idea的插件:maven helper,安装插件后,打开项目pom.xml文件,点击:dependcy Analyzer,界面如下:
点击common-cli,如下:
可以看出依赖包有1.2和1.3.1的包,存在包冲突,排查1.3.1的包即可,排除方法如下:选中右侧1.3.1的版本:右键,点击jump to left tree ,如下:
?右键点击exclude,一键排除冲突包,点击reimport,刷新依赖即可,可以看到common-cli不存在冲突列表:
为什么本地不会冲突?
因为hadoop相关包,scope设置的provided,只在编译时生效,运行时不生效
<!-- 访问hdfs -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>${cdh.hadoop.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${cdh.hadoop.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${cdh.hadoop.version}</version>
<scope>provided</scope>
</dependency>
?为什么服务器上冲突,服务器存在hadoop相关jar包,与打包后的flink-runtime中包含的common-cli存在版本冲突。
?
?
|