Question1: 私たちが知っているように、クラスローダがクラスをロードしようとしている、その親クラスローダに委譲要求。ただし、Tomcatでは、共通のlibディレクトリに置かれた同じ名前のクラスを上書きするためにクラスをロードできます。つまり、Tomcat
WebappClassloader
は委任ポリシーに従っていません。大会の違反ですか?Tomcatのクラスローダは、ポリシーに違反している委任質問2: 私はクラスを書いて共通のlibディレクトリに入れましたが、明らかにクラスはWebアプリケーション間で共有されています。たとえば、すべてのWebアプリケーションは、クラスの静的フィールドを読み書きできます。さらに、JDKのクラスはBootstrapクラスローダーによって読み込まれ、静的フィールドはすべてのWebアプリケーションによって共有されますが、危険ですか?
答えて
この動作は意図的なものであり、Tomcat自体で提供されるライブラリをすべてのWARで個別に上書きすることができます。たとえば、問題を導入したり、他のアプリケーションを壊さずに、コンテナにデプロイされた各アプリケーションごとに異なるバージョンのLog4Jをオーバーライドすることができます。 Tomcatのdocumentationから:多くのサーバアプリケーションと同様
、Tomcatはへのアクセスを持って、許可へのクラスローダー[...]の様々なコンテナの異なる部分、およびコンテナ上で稼働するWebアプリケーションをインストールします利用可能なクラスとリソースの異なるリポジトリへ。このメカニズムは、サーブレット仕様、バージョン2.4で定義された機能、特にセクション9.4と9.6で定義された機能を提供するために使用されます。
これは通常の委任アルゴリズムに違反しますが、これは他のアプリケーションサーバー(JBossなど)でも同様です。
広告。質問2:はい、危険です。あなたは同期について覚えておかなければならず、この変数を誰が変更するかを制御する必要はありません。私はstatic
フィールドを完全に避けるだろう。
たとえばEhCacheはCacheManager
を共有できます。これはnet.sf.ehcache.CacheManager#singleton
static volatile
フィールドで実装されています。これですべての問題が発生します。ehcache.jar
をTomcatの/lib
に入れると、期待通りに動作します。しかし、各Webアプリケーションに独自のJARファイルのコピーがある場合、各WebアプリケーションにはCacheManager
クラスのコピーがあるため、共有は機能しません。 1つのアプリケーションだけにehcache.jar
がある場合、すべてのアプリケーションがを一緒にパッケージ化したものを除き、CachedManager
の同じインスタンスを共有すると、さらに悪化します。このようなエラーは非常に追跡しにくいです...
- 1. suexecポリシー違反
- 2. 戦略パターンと委任パターンの違い
- 3. 委任パターンと間接パターンの違い
- 4. StrictModeポリシーに違反しているものを見つける
- 5. inbuilt google appsの厳しいポリシー違反
- 6. プロトコルを使用しないiOSの委任?委任状態について
- 7. 委任サブドメインは
- 8. 委任機能していない
- 9. 委任機能していない
- 10. Javaの委任パターンについて
- 11. 委任
- 12. サブドメインの委任
- 13. Swift:プロトコルと委任パターンについて
- 14. ビューコントローラの委任と解任
- 15. StrictModeポリシー違反:android.os.StrictMode $ StrictModeDiskReadViolation:policy = 327711違反= 2アプリケーションsuper.onCreate
- 16. サービスクラス委任
- 17. NSViewController委任
- 18. Googleサービスアカウント委任
- 19. 委任 - C#
- 20. ラムダ委任
- 21. FIRMessaging委任エラー
- 22. 委任モード:PARENT_FIRST
- 23. 拡張委任
- 24. アプリの委任は、ビューコントローラ
- 25. 委任のActiveRecordオブジェクトは
- 26. のLogonUserと委任
- 27. C++での委任
- 28. NSPersistentDocumentアプリの委任
- 29. クラッシュWebViewの委任
- 30. StrictModeポリシー違反:StrictModeDiskReadViolation、WriteViolation in Android
あなたの答えをありがとう!はい、すべてのアプリケーションサーバーは委任アルゴリズムに違反する必要があります。 –
あなたの2番目の質問に答える私の更新を見てください。 –