2010-12-14 17 views
5

Apache HTTPClient 3を使用してHTTPリクエストを行うアプリケーションがいくつかあります。最近では、さまざまな理由でHTTPClient 4を使用するWebサービスクライアントの作成も開始されています。 Apacheのスタンスは、 "メジャーリリースは下位互換性がありません"です。バージョン4を使用するために私たちのプロジェクトをすべて更新したいのですが、それは単に実現できません。Javaでパッケージの複数のバージョンにアクセス

私の主な質問はかなり一般的ですが、私の特に質問はあります。 HTTPClientバージョン3と4を同じアプリケーションで使用するにはどうすればよいですか?私たちの場合、アプリケーションはWeb、デスクトップ、またはコマンドラインアプリになります。

私は半閉じているように見えるSO question for java-dynamically-load-multiple-versions-of-same-classを読んだことがありますが、動的部分についてはあまり気にしません。実際には私はJARがアプリケーションと共に出荷されることを望んでいます(例、WebアプリケーションのWEB-INF/lib)。OSGiはこれに似た質問で多くのことが言及されていますが、過度の、簡単な例がそうでないことが分かる)。最後に

私はチームに彼らがドロップすることができます瓶のセットを渡しできるようにしたいと、それだけでHTTPクライアント3.

+1

これは、アーキテクチャガバナンスが良いアイデアでした。つまり、バージョン3に固執するか、すべてをバージョン4に移行するかを決めることです。パッチワークソリューションの実装コストを支払う必要があります。時間が経つと悪化する。 – Anon

+1

@Anon:犯行はありませんが、状況を知らずに、私はそのような毛布の声明を出す助言をしません。私はそのようなコメントを避けるために "様々な理由で"言った。 –

+0

OSGiは少なくとも機能しています(過度な使用かどうかを判断する必要があります)。ライブラリの各バージョンごとに1つずつ、2つのWebサーバーを持つ以外は、これを行う簡単な方法がわかりません。 –

答えて

5

他にも述べたように、複数のクラスローダーを作成し、2つのバージョンを独立してロードすることができます。この部分は簡単です。

これは本質的に "クラススペース"を分割するため、アプリケーションの他の部分からv4を参照しながら、アプリケーションの一部からv3を参照するのは非常に難しいでしょう。アプリケーションを分割する必要があります非常に ...なぜそれを分割して2つのアプリケーションを配信するのはなぜですか?

機能をサービスに組み込むことができれば、OSGiはソリューションになる可能性があります。しかし、レガシーアプリケーションをOSGiに変換することは軽く行うことではなく、あなたが歩いてきたトラップから安価に脱出することは間違いありません。 OSGiとよく知られているOSGiエバンジェリストの本の著者としてこれを言います。アプリケーションをOSGi に変換するという長期的な目標は、に大きなメリットをもたらしますが、大幅な初期コストもかかります。

1

使用する複数のクラスローダ、それぞれに1つを使用して、プロジェクトから独立して動作しますあなたが受け入れることを望むHTTPクライアント。

最も簡単な方法は、URLClassLoaderを拡張し、それをハックして、各バージョンのクラスパスを別々にハードコードすることです。次に、コードの残りの部分が、使用するHTTPクライアントのバージョンを知っていることを確認し、正しいバージョンローダーにアクセスしてアクセスさせる必要があります。

+0

JARがWARとともに出荷されなければならないWebアプリケーションでは、これはどのように機能しますか? –

+0

参照する各ライブラリのすべてのバージョンを出荷しますが、web-inf/lib以外の場所に置いてください。あなたのカスタムクラスローダーは、 "どこかの他の"場所を探します。これにより、戦争コンテナがそれらを直接参照するのを防ぎます。 –

1

v3とv4では、別々のクラスローダーを使用する必要があります。 v3とv4のjarファイルを、アプリケーションのクラスパスを超えて別々のフォルダに配置します。 URLClassLoadedrを使用して、それぞれのバージョンをロードします。クラスローダーのそれぞれに渡すURLには、特定のバージョンのHTTPクライアントへのURLが含まれている必要があります。

しかし、私はあなたに助言を与えることができますか?最初に起動する前にこれらすべてが本当に必要であることを確認してください。それはバージョンが互換性がない可能性があります。しかし、彼らがいる大きな可能性があります。

+1

私はHTTPクライアントv3とV4がうまく一緒に再生されないことを知っています。 –

2

は簡単ですが、簡単な解決策は、あなたがHttpClient3とHttpClient4のためのソースを取得すること、および

org.apache.commons.httpclient3 HttpClient3ためorg.apache.commonsのようなものにパッケージ名をリファクタリングうHttpClient4が衝突を回避するための.httpclient4コンパイル、パッケージ化、完了。

2つの実装を簡単に切り替えることができ、クラスローダーで衝突しません。

+1

これは1つのjarで動作しますが、解決するよりも多くの問題が発生します。たとえば、apache.commons.loggingが必要な場合があり、両方のバージョンは異なるバージョンのコモンズロギングに依存します(異なる時間にリリースされているため)。今度は上記の方法でコモンズログを再パックすることができますが、再コンパイルされたhttpクライアントのすべてのソースコードを手動で編集して正しく参照する必要があります。すぐにそのような解決策は大きな混乱になります。 –

+1

彼らは実際にコモンズロギングの異なるバージョンに依存していますか?最新のものは両方ともうまくいくはずですね。 – Thilo

+2

コモンズラングの人々がこのルートに行くことに注意してください。 Commons Lang 3は、パッケージ名org.apache.commons.lang3を使用します。互換性のないAPIの変更がある場合は、おそらく新しいパッケージ名が最悪の考えではありません。 – Thilo

関連する問題