2011-12-20 12 views
1

私は自分のプログラムでかなり厄介な状況に陥っています。 このケースは...私のプロジェクトはクラスパスにいくつかの重要なユーティリティクラスをパックしているA.jarファイルを持っています。しかし、これはA.jarはかなり古いファイルなので、どのように重要なのかわかりません.... は今、私はServletResponseをI/Fからの方法request.setCharacterencoding() & response.setCharacterEncodingを必要とするが、今私はクラスパスにservlet-api.jar新しいを導入しました。これA.jarServletResponseの古いバージョンが含まれており、原因これに私は上記の2つのメソッドを取得しておりませんでも私のプロジェクトでは、 eクラスのリファレンスをA.jarから受け取り、新しいservlet-api.jarからではありません。特定のjarファイルからクラスを参照してください

はあなたたち、私にservlet-api.jarいうよりはA.jar

から新しいservletResponseの参照を取得する方法を提案してくださいすることができ(詩:私ははA.jarを変更/削除することはできません)

感謝...

+0

カスタムクラスローダーを使用して、そのクラスを使用してservlet-apiからクラスをロードし、そこから取得することができます。しかし、これはあなた自身で行うのは難しいかもしれません。アプリケーションサーバー(JBoss、Websphere、Glassfishな​​ど)で実行している場合、クラスローディング戦略がどのようにサポートされているかを調べることができます。 – Thomas

+0

この質問はあなたに役立つかもしれません:http://stackoverflow.com/q/252893/644766 – melihcelik

+0

またはこの1つ:http://stackoverflow.com/q/60764/644766 – melihcelik

答えて

4

jarファイルを実行するときに、クラスパスにロードするjarファイルの順序を反映させます。構文を正確にする必要があるかどうかを教えてください。しかし、CLASSPATH = patch16.jar:patch15.jar:patch14.jar:... etcなどがあれば、patch16から始まるクラスの最初に一致するコピーをロードします.jarその後、patch15.jarなど

正確な構文上の

詳細情報: http://javarevisited.blogspot.com/2011/01/how-classpath-work-in-java.html

+2

-1これは質問に答えることはできません:並べ替えクラスパスは助けにはなりません。なぜなら、依存関係があるからです。 –

+0

そして、とにかくコードを再コンパイルする必要があります。 (または、依存関係の問題を避けるために、古いクラスをすべて新しいjarファイルに上書きしてください)。 また、移植性を維持するためにクラスパスをスタートスクリプトに設定することもできます。 – LazyCubicleMonkey

+0

あなたは真剣にポイントを逃しています。 classpathを設定すると、彼がA.jarから望むジャーとB.jarからいくつかのクラスに共通するクラスがあるので、この問題を決して*決めることはできません。ロジックは、クラスパスをどのように設定しても、この要件を満たすことはできないことを伝えます。実際にはどちらかを再コンパイルする必要はありません(動的にJavaリンクがあるため、彼は*この問題を抱えています)が、カスタムクラスローダーをJVMに提供する必要があります。クラスローダ。 –

0

シンプルなソリューションは、これらの2つのServletRqquestは異なるパッケージ内にある場合は、単に従来の1が、完全なパッケージとアクセスそれをインポートしません名。 または、そのjarをロードするために独自のクラス・ロードを作成する必要があります。

0

私が見る唯一の方法は、ClassLoaderを取得または作成してから、クラスのコンテンツをバイト配列として取得し、クラスをロードすることです。

0

特別なことをすることなく、あなたはうんざりされます:クラスは、クラスパスにある順序でロードされます。

ただし、それ以外の場合は、クラスパスにA.jar

servlet-api.jar前P.S.を持つ、 servlet-api.jarから ServletResponseをロードし、特にこの場合には、あなたが必要とするクラスのための特別なアクションを取ることができ、カスタム ClassLoaderを書くことができますServletRequestと同じパッケージと名前を持つクラスを作成し、それらを削除した人を探し出します。

1

クラスパス内のA.jarの前にservlet-api.jarがあります。

ただし、問題はすべて解決されていません。 A.jarの古い実装が期待されているにもかかわらず、新しいものがロードされた場合、A.jarの中で何が行われますか?他の人がクラスパスを同じ順序で持っていないとどうなりますか?

あなたははA.jarを解凍して、modified.jarとして

+0

ありがとうFlwyd、しかし、私は以前に述べたように私はA.jarを変更することはできません – Rogger296

1

それを再パッケージ化したほうが良いかもしれ実はJVMは順次リストから資源からそれらをロードしようとしたクラスを探します。たとえば、クラスパスがnew.jar;old.jarのように見え、両方のジャーが同じクラスの異なるバージョンを持っている場合は、new.jarのバージョンが使用されます。

あなたがUnixを使用している場合は、;の代わりに:を使用してください。

しかし、私は疑いを表明するかもしれません。あなたのプロジェクトで何かが間違っているようです。あなたはなぜあなたのカスタムジャーにServletRequestを持っていますか?私は、この種の標準クラスを得るために、標準j2ee.jarかそのようなものを使うべきです。私が知る限り、過去12年間にサーブレットAPIから削除されたメソッドは1つだけです。サーブレットからサーブレットへの通信を行う能力です。そして、これは約10年前に起こりました。したがって、最新バージョンの標準サーブレットAPIを使用している場合は、古いコードを含むすべてが機能するはずです。

+0

こんにちはアレックス、プロジェクトはかなり古く、それは多くの他の小さなモジュールが含まれているので、 (まだわかりません) – Rogger296

+0

すばらしい提案をありがとうございました。 最後に、servlet-api.jarをクラスパスに入れ、次に他のファイルを入れて解決しました。 – Rogger296

関連する問題