2009-10-19 15 views
5

com.sun.java.swing.SwingUtilities2を使用するコンポーネントがアプリケーション内にあります。このクラスは使用しないでくださいが、使用するシステム内のコンポーネントです。Java 6 and SwingUtilities2

したがって、Java 6では使用できなくなったので、NoClassDefFoundErrorを取得します。コンポーネントをアップグレードせずにこの問題を回避するには、それがオプションかどうかまだ分かりません。

+0

あなたはコンポーネントのプロバイダに名前をつけて恥ずかしいですか? –

+0

スポット修正用ですか?ベンダーに6の再構築を依頼することは可能ですか? – reccles

+0

@トム:彼らはそれを修正して以来、我々は時間と金銭的なコストを吸収したくない。たとえば、APIを改善しましたが、この修正以外の改善は必要ありません。同様に、私たちのコードが新しいAPIに合うように隆起を必要とするかどうかはわかりません(時間がかかる)。もちろん、コンポーネントの「アップグレード」コストがあります。 –

答えて

5

その他の選択肢がまったくない場合は、SwingUtilities2からクラスが使用していたものを正確に把握し、SwingUtilities2でその機能のプロキシを作成する必要があります。独自のcom.sun.java.swingパッケージに貼り付けることができます。これは元のコンポーネントと重複します。コンポーネントを読み込む同じクラスローダにSwingUtilities2も認識されている場合は、アプリケーションが動作します。

SwingUtilities2のコンポーネントによっては、コンポーネントをアップグレードしたり書き換えたりするよりもはるかに難しい場合があります。

+0

私は同意します。ソースがどこにでもあるかどうかは分かりますか?私はそれがオープンソースではないことを理解していますが、誰かがそれを置き換えるために何らかのクラスを作成しているに違いありません。 –

+0

ただ逆コンパイル以外のものです。 –

+0

http://www.google.com/search?q=SwingUtilities2.java –

1

Da-dum!これはまさにJVMの内部に頼るべきではないという厄介な警告に注意を払うべき理由です!

+0

しかし、解決策はありますか? –

+3

@Robあなたは@Stephaneが彼がサポートしなければならない問題を作ったと仮定します。問題を解決しなければならなかった場合、どのように問題を解決しますか? – reccles

+2

実際にはソフトウェアに組み込むために購入したコンポーネントに含まれています。このコンポーネントは独自のものであるため、難読化されています。私はまた、このクラスを使用していたことを知っていませんでした(どのようにしてあなたも)ことができませんでした。 –

1

これがうまくいくかどうかわかりません。

SwingUtilities2クラスを取り出してパッチジャーに入れて、クラスパスにこのjarを含めてください。うまくいけば、これはあなたがソースを変更することができるまで動作します。

+0

残念ながら、それはうまくいきません。行((ブール)c .getClientProperty(AA_TEXT_PROPERTY_KEY));これは常にnullを返し、したがってnullpointerexceptionをスローする –

+0

コピーされたクラス内の参照をローカルに参照するように編集する。NPは実際の6変数を使用していると思うレズ。ベンダーに6を再建させるのが最善の方法ですが。いくつかの会社はこれを迅速な修正のためにやっています – reccles

1

ベンダーにこのコンポーネントを修正してJava 6に再構築する唯一の正しい方法です。可能な作業方法はsun.swing.SU2をcom.sun ... SU2にコピーしてパッケージ化することです別のjar(java6fix.jarなど)を作成し、アプリケーションを実行しようとします。このパッチjarをjvm bootclasspathに追加すれば問題ありません。最善のパッチは、com.sun..SU2を独自に作成し、すべての呼び出しをsun.swing.SU2に委任することです。 Java6をサポートする異なるバージョンのコンポーネントを別のベンダーから入手してください。また、問題が上記の行にしかない場合は、((Boolean)c.getClientProperty(AA_TEXT_PROPERTY_KEY));あなたはNPEを防ぐためにこのコンポーネントの独自のクライアントプロパティを置くことができます。このパスを取るときは、単に自分のcom.sun ... SU2.AA_TEXT_PROPERTY_KEYを作成し、このコンポーネントに対してc.setClientProperty(AA_TEXT_PROPERTY_KEY、true)を呼び出すだけです。可能であれば、コンポーネントのアンチエイリアスチェックも無効にしてください。

+0

これはいいことですが、私はこれが高価なルートだと恐れています。このコンポーネントはJDK 5エラーでビルドされているので、JDK 6をサポートしていないという理由でそれらをフォルトできません。 –

+0

もしそうでなければ、私の提案から別のパスを取ってください。 –