我正在开发一个部署在测试和生产环境中的 Hadoop 项目。虽然在测试环境中一切正常,但相同的代码/构建在生产环境中失败,并出现以下错误:
线程“主”java.lang.UnsupportedClassVersionError 中的异常:com/package/vo/MyClassName:不支持的 major.minor 版本 51.0 在 java.lang.ClassLoader.defineClass1(Native Method) 在 java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) 在 java.lang.ClassLoader.defineClass(ClassLoader.java:615) 在 java.security.SecureClassLoader.defineClass (SecureClassLoader.java:141) 在 java.net.URLClassLoader.defineClass(URLClassLoader.java:283) 在 java.net.URLClassLoader.access$000(URLClassLoader.java:58) 在 java.net.URLClassLoader$1.run(URLClassLoader. java:197) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:190) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:306) 在 sun.misc .Launcher$AppClassLoader.loadClass(Launcher.java:301) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:247) 在 java.lang.Class.forName0(Native Method) 在 java。lang.Class.forName(Class.java:247) 在 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。 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields 上的 reflect.Field.getGenericType(Field.java:223)(ReflectiveTypeAdapterFactory.java:117) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 在 com.google.gson.Gson.getAdapter(Gson.java:356) 在 com.google.gson.Gson.fromJson (Gson.java:802) 在 com.google.gson.Gson.fromJson(Gson.java:768) 在 com.google.gson.Gson.fromJson(Gson.java:717) 在 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 版本