私が直面している問題は、この簡単な例にまで遡ります。これを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タイプの検証は、移植性のないバイトコードを作成するようです。 コンパイル時または実行時にこの型検証チェックを無効にする方法はありますか?
ありがとうございました
感謝の意を表します。Pratiyash。ここにもう少し文脈とあなたの質問への答えがあります。 – TEisemann
あなたの質問に対するもう少しの文脈と答えです。私たちは、サポートの違いのjvmベンダーを使用して、Java移植性の真の約束を活用します。私たちは、何千ものお客様に当社の製品を出荷しており、当社のサポートプラットフォームから任意のJVMベンダーを使用することができます。 Java 1.4以降では、sun/oracle jdkでコンパイルしており、IBMのお客様はIBM jvmを使用することができます。それは何年も働いています。 StackMapTable型検証でJava 7の要件を満たしています。 – TEisemann
StringBufferとStringBuilderを一緒に使用する理由については、この簡単なプログラムは、問題を説明するために最小限のものまで蒸留しています。私たちの製品は、StringBuilderとStringBufferをさまざまなクラスで使用する100万行以上のコードを持っています。以前はこれまで問題になっていませんでした。私たちのアプリケーションをJava 7に移行すると、これらの問題に遭遇します。文字列バッファまたはビルダーを除去するためにアプリケーションを書き直すことは実行可能な選択肢ではありません。問題は、型検証を回避する方法、またはスタック・フレーム作成中にOracleコンパイラが型継承を調べる方法に影響を与える方法を見つけることです。 – TEisemann