2016-04-22 8 views
0

私が直面している問題は、この簡単な例にまで遡ります。これをOracle java 7 jdkでコンパイルし、IBM jre 7またはjre 8で実行します。java.lang.AbstractStringBuilderのNoClassDefFoundErrorで失敗します。 http://chrononsystems.com/blog/java-7-design-flaw-leads-to-huge-backward-step-for-the-jvmに関連javacスタックフレームのオペランドの検証タイプを無効にするか、java 7のクラスロード時に無視できますか?

package org.example; 

public class Example { 
    public static void main(String[] args) { 

     StringBuffer sb = new StringBuffer("got it") ; 
     System.out.println(" works "+sb); 

     StringBuilder sb2 = new StringBuilder("other") ; 
     sb2.append("killer") ; 
     sb2.length() ; 
     System.out.println("builder "+sb2); 

     System.out.println(sb == null ? sb2 : sb); 
    } 
} 

のJava 7のコンパイラは、スタックオペランドの型の検証を含めたバイトコードにスタックフレームを追加します。オラクルのJDKでコンパイルこの例の

バイトコードが含まれています:IBMのJDKコンパイラからバイトコードは

frame_type = 255 /* full_frame */ 
     offset_delta = 0 
     locals = [ class "[Ljava/lang/String;", class java/lang/StringBuffer, class java/lang/StringBuilder ] 
     stack = [ class java/io/PrintStream, class java/lang/AbstractStringBuilder ] 

あるが:オラクルから

frame_type = 255 /* full_frame */ 
     offset_delta = 0 
     locals = [ class "[Ljava/lang/String;", class java/lang/StringBuffer, class java/lang/StringBuilder ] 
     stack = [ class java/io/PrintStream, class java/io/Serializable ] 

スタックフレームは、基本クラスAbstractStringBuilderクラスに解決します。そのクラスはIBM JRE rt.jarには存在しません。私たちはビルド・プロセスでOracle JDKを使用します&私はそれを変更することを嫌いです。このJava 7タイプの検証は、移植性のないバイトコードを作成するようです。 コンパイル時または実行時にこの型検証チェックを無効にする方法はありますか?

ありがとうございました

答えて

0

なぜJavaをコンパイルし、異なるベンダーで実行しようとしますか?私は輸入が異なっているのを見ます。どこかで何かが間違っていたかもしれません。 Oracle JDKにもStringBuilderがあります

StringBuilderではなくjava.lang.StringBuilderを使用して、どの出力を取得しているかを共有してください。

java.lang.StringBuffer sb = new java.lang.StringBuffer("got it") ; 
System.out.println(" works "+sb); 

java.lang.StringBuilder sb2 = new java.lang.StringBuilder("other") ; 
+0

感謝の意を表します。Pratiyash。ここにもう少し文脈とあなたの質問への答えがあります。 – TEisemann

+0

あなたの質問に対するもう少しの文脈と答えです。私たちは、サポートの違いのjvmベンダーを使用して、Java移植性の真の約束を活用します。私たちは、何千ものお客様に当社の製品を出荷しており、当社のサポートプラットフォームから任意のJVMベンダーを使用することができます。 Java 1.4以降では、sun/oracle jdkでコンパイルしており、IBMのお客様はIBM jvmを使用することができます。それは何年も働いています。 StackMapTable型検証でJava 7の要件を満たしています。 – TEisemann

+0

StringBufferとStringBuilderを一緒に使用する理由については、この簡単なプログラムは、問題を説明するために最小限のものまで蒸留しています。私たちの製品は、StringBuilderとStringBufferをさまざまなクラスで使用する100万行以上のコードを持っています。以前はこれまで問題になっていませんでした。私たちのアプリケーションをJava 7に移行すると、これらの問題に遭遇します。文字列バッファまたはビルダーを除去するためにアプリケーションを書き直すことは実行可能な選択肢ではありません。問題は、型検証を回避する方法、またはスタック・フレーム作成中にOracleコンパイラが型継承を調べる方法に影響を与える方法を見つけることです。 – TEisemann

0

アドバイスありがとうございました&助けてください。これを掲示した後、我々は根本的な原因を発見した。私たちは古いバージョンのaspect-jを使って、アプリケーションにパッケージングする前にクラスを計測していました。申し訳ありませんが、アスペクトjのインストゥルメンテーションが、変更されたクラスファイルにAbstractStringBuilderを追加した理由が見つかりませんでした。 私たちはもはやアスペクトjを必要としませんでした。だから、それを取り除くことは問題を解決した。

ありがとうございました

関連する問題