7

Apache Felix OSGi コンテナー内で実行される JSP Web アプリケーションを構築しています (Web アプリケーション自体は OSGi バンドルです)。現在、次の問題に直面しています。

JSP 2.0 仕様によると、TLD (taglib 記述子) は Web アプリの WEB-INF フォルダー内に存在する必要がなくなり、taglib の jar META-INF フォルダーから直接読み込まれます。この taglib jar は通常、Web アプリの WEB-INF/lib フォルダー内にありますが、OSGi バンドルであるため、Felix によって読み込まれます。

taglib の OSGi 情報では、必要なすべてのパッケージをインポートします。ロードされたOSGiバンドル内でもTLDを検索するようにサーブレットに指示する方法を知っている人はいますか?

ご協力いただきありがとうございます!

4

2 に答える 2

3

TLDが webapp とは異なるバンドルにある場合、Pax は TLD を見つけられません。

タグ ライブラリ

カスタム タグ ライブラリを機能させるには、バンドル内の「特別な」場所で TLD ファイルにアクセスできる必要があります。

  • Bundle-ClassPath マニフェスト エントリによって参照される任意の jar 内のすべての tld ファイル
  • バンドル jar 内の WEB-INF ディレクトリまたは WEB-INF のサブディレクトリ内のすべての tld ファイル

インポートしたパッケージは検索されないことに注意してください (このサポートは後で追加される可能性があります)。

複数の webapp バンドル間で OSGi-fied Struts バンドルを共有する Struts ベースのシステムでこの問題が発生しています。Web アプリケーションには、Struts taglib を必要とする JSP があります。

少しハックな (TLD をあちこちにコピーするため) 回避策は、TLD を Web アプリケーションのMETA-INFディレクトリに配置し、Web アプリケーション バンドルに必要な Struts パッケージをインポートさせることです (または、Struts を使用しない場合は、タグを処理するクラスは何でも)。これは次のように Maven で自動化できます。

    <plugin>
      <!--
      Extract the TLD file from the Struts bundle you are using
      and place it in src/main/resources/META-INF of your webapp's
      project directory during generate-resources. This will make
      the file end up in the appropriate place in the resulting WAR
      -->
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <executions>
        <execution>
          <id>extract-tld</id>
          <phase>generate-resources</phase>
          <goals>
            <goal>unpack</goal>
          </goals>
          <configuration>
            <artifactItems>
              <artifactItem>
                <groupId>org.apache.struts</groupId>
                <artifactId>struts2-core</artifactId>
                <version>${struts.version}</version>
                <outputDirectory>src/main/resources</outputDirectory>
                <includes>META-INF/struts-tags.tld</includes>
              </artifactItem>
            </artifactItems>
          </configuration>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <!--
      Add the required Manifest headers using the maven-bundle-plugin
      -->
      <groupId>org.apache.felix</groupId>
      <artifactId>maven-bundle-plugin</artifactId>
      <configuration>
        <!-- ... -->
        <instructions>
          <!-- ... -->
          <Import-Package>[...],org.apache.struts2.views.jsp</Import-Package>
        <!-- ... -->
        </instructions>
      </configuration>
    </plugin>
于 2010-10-07T14:36:48.227 に答える
0

一般に、OSGi と Java EE ライブラリを統合するのは困難です。Nuxeo CMS の人々は Seam Framework と OSGi を統合することに成功したので、彼らのアイデアを使用すると、JSP TLD と OSGi をさらに簡単に統合できると思います。Nuxeo をダウンロードして、そのソース コードを分析するだけです: http://www.nuxeo.org/xwiki/bin/view/Main/

ただし、OSGi と Java EE の統合は一般に困難です。OSGi ランタイム統合が本当に必要ですか。おそらく、Maven コンパイル時統合で十分でしょうか? 多くの人は、Maven や類似のツールをコンパイル時の OSGi と見なしています。

于 2010-10-11T18:15:44.820 に答える