2010-11-23 22 views
1

私は多くの.classファイルを含むフォルダを持っています。このクラスは'app 1'から更新されています。これらのクラスを動的に読み込む'app 2'があります。tomcat - 動的にクラスをリロードする

そして、問題がある....

「アプリ2」は、クラスファイルを使用して、そのファイル「アプリ1」更新、再びクラスを必要とその後、「アプリ2」それ古いクラスのコピーを保持して使用するように見えます。

フォルダを確認したところ、クラスは正常に更新されました。'app 2'をリロードしようとしましたが、古いクラスが使用され続けます。

私がtomcatを再起動した場合のみ、'app 2'は新しいクラスを読み込みます。

なぜですか? 'app 2'を再ロードすることは許可されていますが、実稼働環境ではTomcatを再起動できません。

私の仕事で非常に重要な、私は.....

を任意のアイデアに感謝し、私はtomcat6のクリーンインストールを使用していますし、私はクラスファイルをロードし、その: Class.forName(<classname>).newInstance()

THXたくさん

答えて

0

私はあなたがこれらの2つのアプリケーションのクラスを分離しようとするべきだと思います。最初に2つの同一のディレクトリを作成してください。 1つはapp1、2つ目はapp2です。これで問題が解決すれば、クラスをjarファイルにパックし、jarファイルを2つだけ複製してください。問題はJavaではなくファイルシステムであると私は思う。私はあなたが窓を使っていると信じています。もしそうなら、おそらくあなたが今Linuxでやっていることをやろうとします(あなたの会社にとっては無関係でない限り)。

3

問題は、ランタイムが古いクラスファイルを、変更されたクラスを使用するコードで使用されているクラスローダーに既にロードしていることです。クラスローダーがクラスの内容をディスクからリフレッシュして、必要なものを達成する方法を見つける必要があります。これは、Class.forName()が動作しない理由です。クラスが既にロードされ(キャッシュされた)バージョンにアクセスしています。 Alex Rは、これらの2つのプロジェクトのクラスを分けるためにコードを再構成しようとするべきです。しかし、クラスをリロードしようとして死んでしまった場合、Classloader.defineClass()を試してクラスの新しいバージョンを.classファイルからbyte []に​​ロードしてみてくださいそのバイト[]をClassloader.defineClass()に渡します。 Tomcatでは(トップレベルのTomcatクラスローダーではなく)アプリケーションに関連付けられたコンテキストクラスローダーを使用したいと思うでしょう。 Tomcatプロジェクトのドキュメンテーションの2つを区別する文書があります。

1

デフォルトの動作では、クラスはロードされたClassLoaderによってキャッシュされます。あなたが:Class.forName('MyClass')を2回連続して実行すると、初めてクラスをロードするだけです。

クラスをリロードするには、既にこのクラスのインスタンスに既に存在する参照だけでなく、ロードしたClassLoaderへの参照を解放する必要があります。そうすれば、クラス全体がガベージコレクトされることができます(または、メモリリークに終わることになります - ウェブアプリケーションをリロードする際の永続的な問題)。

ClassLoaderを拡張して、キャッシングの動作を変更することができます。

+0

こんにちは、イムしかし、あなたはどのように私は、キャッシュの動作を変更することができますか? – david

関連する問題