web-dev-qa-db-ja.com

Tomcatでアプリケーションごとにカスタムクラスパスを作成できますか

一部のアプリケーションではZKを使用し、他のアプリケーションではHibernate、その他のApache Commonsなどを使用しています。

たくさんのライブラリーを使用しているという理由だけで、75MBのwarファイルをデプロイしたくありません。

ライブラリをTomcat libフォルダーに追加したくありません。また、ライブラリーx.1を使用している古いアプリケーションとライブラリーx.2を使用している別のアプリケーションがあるため、その構成へのクラスパスも使用しません。

このため、web.xmlまたはcontext.xmlに何かを記述して、次のように記述できると便利です。

<classpath>/usr/local/Tomcat/custom-libs/zk-5.0.4</classpath>

注:上記は疑似コードです

32
Spider

Tomcat 7以降、本番環境でVirtualWebappLoaderを使用できないという言及はありません。私はそれを試してみましたが、それは夢のように機能します。以下をMETA-INF/context.xmlに追加するだけです。

<?xml version="1.0" encoding="UTF-8"?>

<Context antiJARLocking="true" path="/websandbox">
    <Loader className="org.Apache.catalina.loader.VirtualWebappLoader"
          virtualClasspath="/usr/.../*.jar;/usr/.../*.jar"/>
</Context>

Netbeansのパッケージングでは、すべてのパッケージのチェックを外し、.warサイズをゼロにして、依存関係がサーバー上の正しいフォルダーにあることを確認し、アップロードします。イェイ! 100 MBのWARファイルはありません。

36
Spider

さらに@Spiderの回答。

Tomcat Context hold Loader 要素。 docs によると、デプロイメント記述子(<Context>タグ内の内容)は次の場所に配置できます。

  • $CATALINA_BASE/conf/server.xml-悪い-設定を再読み込みするためにサーバーの再起動が必要
  • $CATALINA_BASE/conf/context.xml-悪い-すべてのアプリケーションで共有
  • $CATALINA_BASE/work/$APP.war:/META-INF/context.xml-悪い-設定を変更するには再パッケージが必要
  • $CATALINA_BASE/work/[enginename]/[hostname]/$APP/META-INF/context.xml-ニース、最後のオプションを参照してください!!
  • $CATALINA_BASE/webapps/$APP/META-INF/context.xml-ニース、最後のオプションを参照してください!!
  • $CATALINA_BASE/conf/[enginename]/[hostname]/$APP.xml-best-完全にアプリケーションの外にあり、自動的に変更をスキャンします!!!

ここでは、$CATALINA_BASE階層からプロジェクトファイルの開発バージョンを使用する方法を示す私の構成(このファイルをsrc/test/resources dirに配置し、Mavenに${basedir}プレースホルダーをpom.xml<filtering>true</filtering>新しい環境でビルドした後、それを$CATALINA_BASE/conf/Catalina/localhost/$APP.xml)にコピーします。

<Context docBase="${basedir}/src/main/webapp"
         reloadable="true">
    <!-- http://Tomcat.Apache.org/Tomcat-7.0-doc/config/context.html -->
    <Resources className="org.Apache.naming.resources.VirtualDirContext"
               extraResourcePaths="/WEB-INF/classes=${basedir}/target/classes,/WEB-INF/lib=${basedir}/target/${project.build.finalName}/WEB-INF/lib"/>
    <Loader className="org.Apache.catalina.loader.VirtualWebappLoader"
            virtualClasspath="${basedir}/target/classes;${basedir}/target/${project.build.finalName}/WEB-INF/lib"/>
    <JarScanner scanAllDirectories="true"/>

    <!-- Use development version of JS/CSS files. -->
    <Parameter name="min" value="dev"/>
    <Environment name="app.devel.ldap" value="USER" type="Java.lang.String" override="true"/>
    <Environment name="app.devel.permitAll" value="true" type="Java.lang.String" override="true"/>
</Context>

[〜#〜] update [〜#〜]Tomcat 8の構文を変更<Resources>および<Loader>要素、対応する部分は次のようになります。

<Resources>
    <PostResources className="org.Apache.catalina.webresources.DirResourceSet"
                   webAppMount="/WEB-INF/classes" base="${basedir}/target/classes" />
    <PostResources className="org.Apache.catalina.webresources.DirResourceSet"
                   webAppMount="/WEB-INF/lib" base="${basedir}/target/${project.build.finalName}/WEB-INF/lib" />
</Resources>
20
gavenkoa

別の少しハックな代替手段。

rlclassloader から派生する5〜6行のカスタムクラスローダーを記述し、 addUrl() メソッドを使用してクラスパスjarを追加するだけです。

次に、アプリケーションコードでスレッドのコンテキストクラスローダーとして設定します。

Thread.setContextClassLoader(new CustomClassloader(path, parentClassLoader)

親クラスローダーは通常、

Thread.getContextClassloader()
7
Fakrudeen

これは、META-INF/context.xmlファイルを使用できる目的です。特定のWebアプリケーションのクラスをロードする独自のWebアプリケーションローダーを定義しました。これは私が使用したリファレンスです: http://Tomcat.Apache.org/Tomcat-5.5-doc/config/loader.html (編集:Tomcat 6の場合: http:// Tomcat.Apache.org/Tomcat-6.0-doc/config/loader.html 、Tomcat 7の場合: http://Tomcat.Apache.org/Tomcat-7.0-doc/config/loader.html

また、このフェローはあなたの正確な問題(含まれている例)の解決策を投稿しているようです: http://Java.dzone.com/articles/extending-Tomcat-webapploader

7
Nick