2017-08-11 40 views
0

有趣的是,我的战争文件slf4j依赖抱怨java.lang.UnsupportedClassVersionError:JVMCFRE003错误的主要版本;类=组织/ SLF4J/IMPL/StaticLoggerBinder,偏移= 6

java.lang.UnsupportedClassVersionError: JVMCFRE003 bad major version; class=org/slf4j/impl/StaticLoggerBinder, offset=6 

,这是WebSphere 8.5

Java version = 1.6.0, Java Compiler = j9jit26, Java VM name = IBM J9 VM 

使用的Java版本并为slf4j-api-1.7.5.jarslf4j-simple-1.7.5.jar的MANIFEST.MF是

Build-Jdk: 1.6.0_23 

我只能想到的IBM JDK与Sun JDK不同,但它们仍然处于相同的Java版本(6),那么如何才能异常仍然发生?

我认为错误是由于运行环境是旧的JDK,但该文件在新的JDK中编译。

回答

1

(也看到这个答案,直接讲Java类资源的主要和次要版本:List of Java class file format major version numbers?

最可能的是,该类的主要版本比你的环境中支持更高。

您需要查看实际的类字节,以说明“StaticLoggerBinder”的主要版本是什么,才能确切了解发生异常的原因。也就是说,此内容的字节:

组织/ SLF4J/IMPL/StaticLoggerBinder.class

的JAR文件:

SLF4J-简单1.7.5.jar

这些清单属性可以从JAR打包时使用的构建步骤中提供良好的信息,但它们并不是例外情况。例外情况是查看存储在原始类字节中的主版本值和次版本值。

使用十六进制编辑器查看类文件的前几个字节(例如,在hexl模式EMAC),会显示这样的事情:

00000000: cafe babe 0000 0032 0071 0a00 0f00 4809 .......2.q....H. 
00000010: 001f 0049 0900 4a00 4b0a 004c 004d 0800 ...I..J.K..L.M.. 

使用Oracle的类格式的文档:

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html

ClassFile { 
    u4    magic; 
    u2    minor_version; 
    u2    major_version; 
    u2    constant_pool_count; 
    cp_info  constant_pool[constant_pool_count-1]; 

我们看到,前八个字节必须是“魔术”值0xcafebabe,接下来的四个字节是次要版本(通常是0x00),接下来的四个字节是主要版本。通过J2SE 9,所定义的有效主要和次要版本的值是:

JDK_11(45, 3, "JDK 1.1"), // "0x2D" 
    JDK_12(46, 0, "JDK 1.2"), // "0x2E" 
    JDK_13(47, 0, "JDK 1.3"), // "0x2F" 
    JDK_14(48, 0, "JDK 1.4"), // "0x30" 
    JDK_50(49, 0, "J2SE 5.0"),// "0x31" 
    JDK_60(50, 0, "J2SE 6.0"),// "0x32" 
    JDK_7 (51, 0, "J2SE 7"), // "0x33" 
    JDK_8 (52, 0, "J2SE 8"), // "0x34" 
    JDK_9 (53, 0, "J2SE 9"); // "0x35" 

样品字节表明的0x32主要版本,或J2SE 6.0。

该表从该实用程序枚举采取:

public enum JDKVersion { 
    JDK_11(45, 3, "JDK 1.1"), // "0x2D" 
    JDK_12(46, 0, "JDK 1.2"), // "0x2E" 
    JDK_13(47, 0, "JDK 1.3"), // "0x2F" 
    JDK_14(48, 0, "JDK 1.4"), // "0x30" 
    JDK_50(49, 0, "J2SE 5.0"),// "0x31" 
    JDK_60(50, 0, "J2SE 6.0"),// "0x32" 
    JDK_7 (51, 0, "J2SE 7"), // "0x33" 
    JDK_8 (52, 0, "J2SE 8"), // "0x34" 
    JDK_9 (53, 0, "J2SE 9"); // "0x35" 

    private JDKVersion(int majorVersion, int minorVersion, String textValue) { 
     this.majorVersion = majorVersion; 
     this.minorVersion = minorVersion; 
     this.textValue = textValue; 
    } 

    private final int majorVersion; 
    private final int minorVersion; 
    private final String textValue; 

    // getters omitted ... 
} 

随着“majorVersion”,并从该被检查的类资源的原始字节值获得“minorVersion”。

0

看着this link,我不认为你在看正确的罐子。

slf4j-api-1.7.5.jar只包含api,而不是实现。您需要找到哪个jar包含StaticLoggerBinder的实现,并且这是已经在更高版本中编译的jar。

+0

对不起我不好,我的战争文件也包含'slf4j-simple-1.7.5.jar'。我已经更新了我的问题 – Dreamer

0
  1. slf4j-api-1.7.5.jar不包含StaticLoggerBinder类。 寻找合适的罐子。
  2. 您应该在MANIFEST上看到X-Compile-Target-JDK属性,而不是Build-jdk
+0

对不起,我的战争文件还包含'slf4j-simple-1.7.5.jar'。我相应地更新了我的问题 – Dreamer

+1

您可能在其他jar中有另一个StaticLoggerBinder,这个类是slf4j用来自动装载slf4j实现的东西。例如,logback具有并执行此操作。 – leoconco

0

如果您正在使用WAS v8.5.5,你需要与WAS v8.5.5一起安装JDK 1.7或1.8(如果v8.5.5是updqated一些补丁包),并配置您的服务器使用它

相关问题