用eclipse导出jar包到虚拟机上用hadoop运行时遇到的问题
问题描述:
用eclipse写好代码后,在windows上运行正常。将其导出成jar文件,并放到ubuntu虚拟机上运行出现问题:
Exception in thread "main" java.lang.ClassNotFoundException: matrixMul at java.net.URLClassLoader.findClass(URLClassLoader.java:387) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at org.apache.hadoop.util.RunJar.run(RunJar.java:237) at org.apache.hadoop.util.RunJar.main(RunJar.java:158)
步骤1:导出jar包时,指定类位置
我的matrixMul类中包含了另外两个类,可能让机器不知道从哪个类开始。
在导出jar时,不直接点Finish,而是点Next
直到看到这个界面:
选择开始的类:
但是ubuntu执行新生成的jar后,出现了新的问题:
Exception in thread "main" java.lang.UnsupportedClassVersionError: mapreduce/matrixMul has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:756) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:473) at java.net.URLClassLoader.access$100(URLClassLoader.java:74) at java.net.URLClassLoader$1.run(URLClassLoader.java:369) at java.net.URLClassLoader$1.run(URLClassLoader.java:363) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:362) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at org.apache.hadoop.util.RunJar.run(RunJar.java:237) at org.apache.hadoop.util.RunJar.main(RunJar.java:158)
看开头的那句话,意思是版本问题
步骤2:修改java版本
在ubuntu上运行javac -version查看版本
而eclipse用的是JavaSE-17。虽然不知道他们之间是什么关系,但感觉就是这里的问题。
新建一个java项目,该版本为java1.8
重新执行之前做的事,这次终于成功:
可喜可贺,可喜可贺!