2009-05-26 14 views
0

私は実際的な問題を抱えています。問題は次のようにまとめられます。Javaのシステムプロパティをオーバーライドする方法はありますか?

私たちは、提供されたAPIを使用して外部CMS内でイベントがトリガーされたときに、何らかのタスクを実行するコンポーネント(プラグインと言う)を開発しています。彼らはいくつかのjarライブラリを提供しました。そこで私たちがやっているのは、それらが提供するインタフェースを実装することです。次に、イベントがトリガされたときに内部メソッドが呼び出されます。 (最初のイベントがトリガされたときにCMSは、クラスのインスタンスを1つだけ作成され、それはちょうど、各イベントのトリガとメソッドを実行する)次のように

機能をまとめることができ、

import com.external.ProvidedInterface; 


public class MonitorProgram implements ProvidedInterface{ 

    public void process(){ 
     //This method is called when an event is triggered in CMS 
    } 

} 

私たちのクラスの私たちの中で「javax.net.ssl.HttpsURLConnection」(JAVA 1.5)を使用しています。しかし、HttpsURLConnectionは1.4のcom.sun.net.sslからjavax.net.sslに移行しました。しかし、それはそうです、私が言及していますCMSは、(私たちが実際に彼らの実装を知らない)我々のコードでClassCastExceptionが発生につながるこの

System.setProperty("java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol"); 

のようなものを使用しています。

私の質問ははっきりしていると思います。私たちのケースでは、VMインスタンスがCMSと私たちのプログラムでも同じです

System.setProperty("") 

ので、

-Djava.protocol.handler.pkgs= 

はまた、我々が使用して、それをバックに設定カント、VMパラメータを設定傾けます。

この問題を解決するにはどうすればよいですか?そしてアイデアや経験は?

+0

を参照してください?あなたの質問ではあまり明確ではありません。 –

+0

System.setPropertyを使用すると、プロパティがVMに設定され、CMS(外部パーティ)が誤動作する原因となります。そして、私たちは上記のクラスをCMSのインストール内に保つだけです。私たちは手動で実行するつもりはありません。 CMSは自動的にインスタンスを作成するので、VMパラメータを設定する方法はありません –

+1

これをクリアするには、CMSで "HttpsURLConnection"を返すものを呼び出します。しかし、javax.net。*ではなく、com.sun.net.ssl。*から何かを作成しようとします。 CMSがjavax.net。*を使用するように強制すると、CMSのコードのどこかにClassCastExceptionがスローされます。そうしないと、コードにClassCastExceptionがあります。あれは正しいですか? –

答えて

2

これは私にとっては明らかではありません。

システムプロパティを上書きしますか? これを行うことができます。

と呼ばれるプロセスは、システムを上書きすることを、外部ライブラリのメソッドを呼び出す前にSystem.propertyを上書きし、メソッドが返すとき、あなたが戻って

final String propertyName = "Property"; 
    String oldProperty = System.getProperty(propertyName); 
    System.setProperty(propertyName,"NEW_VALUE"); 
    monitorProgram.process(); 
    System.setProperty(propertyName,oldProperty); 

それとも、ないようにしたいんが、古いSystem.propertyを設定することができます.property? なぜシステムプロパティを手動で設定できないのですか?

+0

こんにちは、私は元の投稿に説明と上記のコメントを追加しました。 –

0
  1. は、スタックトレースで問題のあるクラス
  2. 使用jadまたはそれを逆コンパイルするために同様のツールを探します。
  3. プロパティの名前を修正してください。
  4. 結果のファイルをコンパイルし、CMSのjarファイル内の.classファイルを置き換えるか、クラスパスの前の場所に配置してください。
  5. 使用antは(も、コンパイルをし、JARの構築;ない逆コンパイル)、このプロセスを自動化する
  6. をそれが動作するとき、あなたはすべてを救うことを確認します(オリジナルファイル、変更されたファイルを、ファイルをビルドする)ことができますので、どこかでもう一度やり直してください。

これは問題を解決するうそまたは危険な方法のように聞こえるかもしれませんが、それは動作します。特に、あなたのCMSプロバイダが積極的に彼の製品を開発していないように見えるからです。

+0

私たちは、CMS提供のアーカイブに変更を加える権限がありません。我々はそれらを解放していない。それらのJarファイルを入手するのは顧客の責任です –

+0

これを修正するようにバグレポートを提出するのはどうですか? –

1

さまざまなプロパティを使用するために2つのコードを取得することに成功するつもりはないと思います。

ただし、独自のコードでは、独自のURLStreamHandlerFactoryを定義できます。これを行うと、URLからjavax.net.ssl.HttpsURLConnectionを作成できます。プロトコルハンドラは把握するのが最も簡単なことではありませんが、私はあなたが彼らに仕事をさせることができると思います。あなたがするSystem.setPropertyと-Djava.protocol.handler/PKGSを使用することはできませんなぜ

http://java.sun.com/developer/onlineTraining/protocolhandlers/