我正在开发一个部署在测试和生产环境中的Hadoop项目。虽然在测试环境中一切正常,但生产环境中的相同代码/构建失败,并出现以下错误:
线程中的异常" main" java.lang.UnsupportedClassVersionError:com / package / vo / MyClassName:不支持的major.minor版本51.0 at java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)at at java.lang.ClassLoader.defineClass(ClassLoader.java:615)at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 在java.net.URLClassLoader.defineClass(URLClassLoader.java:283)at java.net.URLClassLoader.access $ 000(URLClassLoader.java:58)at java.net.URLClassLoader $ 1.run(URLClassLoader.java:197)at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(URLClassLoader.java:190)at java.lang.ClassLoader.loadClass(ClassLoader.java:306)at sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:301)at at java.lang.ClassLoader.loadClass(ClassLoader.java:247)at java.lang.Class.forName0(Native Method)at java.lang.Class.forName(Class.java:247)at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:95) 在 sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:107) 在 sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:31) 在 sun.reflect.generics.visitor.Reifier.reifyTypeArguments(Reifier.java:50) 在 sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:120) 在 sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:31) 在 sun.reflect.generics.repository.FieldRepository.getGenericType(FieldRepository.java:67) 在java.lang.reflect.Field.getGenericType(Field.java:223)at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:117) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 在com.google.gson.Gson.getAdapter(Gson.java:356)at com.google.gson.Gson.fromJson(Gson.java:802)at com.google.gson.Gson.fromJson(Gson.java:768)at com.google.gson.Gson.fromJson(Gson.java:717)at com.google.gson.Gson.fromJson(Gson.java:689)
我理解这应该是由于编译类时使用的java版本与用于运行相同的java版本之间的版本不匹配。
但我检查了这一点,看到我的测试和生产环境都使用jre 7,我相信版本51应与此兼容。
测试环境
]$ java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
生产环境
]$ java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
测试环境中使用的Hadoop版本:Hadoop 2.6.0.2.2.9.0-3393 生产环境中使用的Hadoop版本:Hadoop 2.4.0.2.1.15.3-7
上面的类在shell脚本中使用以下命令运行,这是发生错误的地方。
**java -cp $ALL_JARS com.package.hello.hadoop.udf.GetCount**
其中ALL_JARS是':' jar文件的分隔列表,其中一个包含上面的类GetCount,另一个包含显示错误的类:com / package / vo / MyClassName
我是否知道这里可能出现的问题以及仅在与测试环境具有相同java版本的生产环境中也是如此