2012-03-05 8 views
6

最近サーブレットAPI 3.0に移行しました。 web.xmlではいくつかの変更が必要なフレームワークを開発中であるため、フレームワークの変更が行われるたびに、フレームワークに基づいたプロジェクトはweb.xmlを更新する必要があります。巨大なプロジェクト環境でWebフラグメント(サーブレットAPI 3.0)を利用する

サーブレットAPI 3.0には、この動作をより疎結合かつ動的にするために、新しいWebフラグメントが導入されています。私はweb-fragment.xmlを作成し、そこのweb.xmlからすべてのものを移動します。したがって、プロジェクトでは次のように定義するだけです。web.xmlとそれ自身の追加宣言。

<?xml version="1.0" encoding="UTF-8"?> 
<web-app 
    version="3.0" 
    metadata-complete="false" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
</web-app> 

は、我々は、我々のフレームワークがMETA-INF/web-fragment.xmlを持っている(JARファイルでフラグメントの検索を有効にするためにmetadata-complete="false"を使用する必要があります。

我々は他のフレームワークやライブラリ(約80〜90)とに多くの依存関係を持っているので、 metadata-complete="false"はまた、すべてのライブラリを検索するために容認できない12秒に占める注釈を検索。

メカニズムを、それは素晴らしい作品と私​​たちはより多くのdecouであるという事実を好きなようにトリガ私たちのフレームワークから抜け出していますが、起動時間は致命的です!また、-Xms256m -Xmx512mから-Xms512m -Xmx1024mへの利用可能なメモリを増やして、java.lang.OutOfMemoryError: Java heap space(Tomcatの非効率的に実装された注釈プロセッサ(約50.000クラスがキャッシュされている)に起因する)を取得せずに開始する必要があります。


私たちは、ライブラリ内のアノテーション検索を無効にすることができることを知って、私たちはmetadata-complete="true"旗を持っていない、ほとんどのサードパーティ製を使用するように、これはまた、オプションではありません。

アノテーションの検索を無効にすることはできますか?あるいは、サーブレットコンテナが、宣言されたライブラリ内で、web-fragment.xmlのみを検索するように強制できますか?

私は本当に新しいWebフラグメント機能を使用したいと思いますが、起動時間とメモリを増やすことはできません。

答えて

3

特定のJARファイルの設定によってアノテーション処理を無効にすることができます。私はJARファイルのためだけに使用しましたが、爆発のためには動作しませんWAR s。 、<tomcat>/conf/catalina.propertiesにライン76(Tomcatの7.0.22)を見て:

# List of JAR files that should not be scanned for configuration information 
# such as web fragments, TLD files etc. It must be a comma separated list of 
# JAR file names. 
# The JARs listed below include: 
# - Tomcat Bootstrap JARs 
# - Tomcat API JARs 
# - Catalina JARs 
# - Jasper JARs 
# - Tomcat JARs 
# - Common non-Tomcat JARs 
# - Sun JDK JARs 
# - Apple JDK JARs 
+0

これは本当に解決策です、ありがとうございます!残念ながら、これはサーブレットコンテナ依存の解決策になります。すべてのサーブレットコンテナで実行することを目標としています。したがって、このソリューションは私たちにとっては良い選択ではありません。 – codevour

+0

@codevourどのようにして問題を解決しましたか? – phant0m

0

7.0.30ためJAR走査を制御可能にTomcatの一部のシステムプロパティがあります。ドキュメントページhereを確認してください。

は、基本的にはこれらのものは以下のとおりです。

  • tomcat.util.scan.DefaultJarScanner.jarsToSkip
  • org.apache.catalina.startup.ContextConfig.jarsToSkip
  • org.apache.catalina.startup.TldConfig.jarsToSkip

わからないあなたは多分、ContextListenerそれらを設定することが最も早い時間は何ですか?

関連する問題