最近公司要搭建大数据系统,架构师推荐使用flink来搭建这套系统。所以我这边这天在自己的虚拟机环境(Ubuntu16.4)下调研玩一下Flink。
从ververica上学习了一下flink的基础知识,因为之前是做python数据处理分析的工作,最近才学习Java,还没有专门学习maven的相关知识。所以从FLINK官方教程拉了一份JAVA的项目模板,并从ververica里找了一份大佬提供的Flink教程demo 实时热门商品推荐在本地试着调一调。
问题现象自己按照教程一步敲了一遍,在集成环境中代码没有检查到错误,但是在运行时发现报错。最后找到GitHub上的源码copy运行了一遍依旧报错。报错信息为:
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/flink/api/common/typeinfo/TypeInformation
详细错误信息为:
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -javaagent:/usr/local/idea/lib/idea_rt.jar=40232:/usr/local/idea/bin -Dfile.encoding=UTF-8 -classpath /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/charsets.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/cldrdata.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/dnsns.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/icedtea-sound.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/jaccess.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/localedata.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/nashorn.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/sunec.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/zipfs.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/jce.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/jsse.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/management-agent.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/resources.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar:/home/hadoop/MyFlink/testFlink/quickstart/target/classes:/home/hadoop/.m2/repository/org/slf4j/slf4j-api/1.7.15/slf4j-api-1.7.15.jar:/home/hadoop/.m2/repository/org/slf4j/slf4j-log4j12/1.7.7/slf4j-log4j12-1.7.7.jar:/home/hadoop/.m2/repository/log4j/log4j/1.2.17/log4j-1.2.17.jar org.myorg.quickstart.HotItems
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/flink/api/common/typeinfo/TypeInformation
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: org.apache.flink.api.common.typeinfo.TypeInformation
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:419)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:352)
... 7 more
Process finished with exit code 1
问题原因
考虑到集成开发环境中的代码没有报错,所以不是代码逻辑的问题。因为在网上检索相关问题后,发现有大佬指出是官方提供的maven的配置有问题。
找到从flink官网下载的pom.xml文件,发现其scope标签均设置为provided
查找maven的scope的标签的作用
因为maven的原则是约定大于配置,所以新手基本使用默认配置让maven的逻辑去寻找对应的包会是一个更优的策略。官网提供的provided配置可能需要在其他地方进行额外的申明才行,因为我这边对maven使用还不熟悉,所以将pom.xml文件中scope的配置全部替换成compile,来保证程序demo的正常运行。
解决方法
将pom.xml文件中scope的配置全部替换成compile,并重新尝试编译执行。程序编译通过,并且可以正常输出结果。
参考资料
https://www.cnblogs.com/hzzll/p/6738955.html
作者:刘乘九