2017-08-11 33 views
0

は、私のwarファイルからslf4j依存性はおよそjava.lang.UnsupportedClassVersionError:JVMCFRE003不正なメジャーバージョン。クラス= ORG/SLF4J/IMPL/StaticLoggerBinder、興味深いことに= 6

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

文句をオフセットし、これは8.5

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

のWebsphereで使用される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 - シンプル-1.7.5.jar

これらのマニフェストを:JARファイルの

ORG/SLF4J/IMPL/StaticLoggerBinder.class

:それは、このエントリのバイトですプロパティは、JARがパッケージングされたときに使用されたビルド・ステップからの良好な情報を提供することがありますが、例外が何を見ているのかは異なります。例外は、未処理のクラスバイトに格納されているメジャーおよびマイナーバージョンの値を調べています。

16進エディタでクラスファイルの最初の数バイトを確認します。私たちは、最初の8つのバイトをしなければならないことを見

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]; 

:Oracleのクラス形式のドキュメントを使用して

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.. 

:HEXLモードでは、Emacsは)、このようなものが表示されます"magic"の値0xcafebabe、次の4バイトはマイナーバージョン(通常は0x00)で、次の4バイトがメジャーバージョンです。 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

それを使用するようにサーバーを構成申し訳ありませんが、私の悪いですが、私のwarファイルには 'slf4j-simple-1.7.5.jar'も含まれています。私はそれに応じて私の質問を更新しました – Dreamer

0
  1. slf4j-api-1.7.5.jarは、StaticLoggerBinderクラスを含まない。 右の瓶を探してください。
  2. Build-jdkではなく、MANIFESTにX-Compile-Target-JDKプロパティが表示されます。
+0

申し訳ありません私の悪い、私の戦争ファイルは 'slf4j - シンプル - 1.7.5.jar'も含まれています。私はそれに応じて私の質問を更新しました – Dreamer

+1

他のjarファイルに別のStaticLoggerBinderがあるかもしれませんが、このクラスはslf4jがslf4j実装をautowireするために使うものです。たとえば、logbackがこれを実装しています。 – leoconco

0

あなたはv8.5.5 WASを使用している場合(v8.5.5が、いくつかのフィックスパックにupdqatedされている場合)、あなたはJDK 1.7または1.8をインストールする必要がv8.5.5 WASと

関連する問題