2010-07-16 42 views
7

我們正在構建一個JSP Web應用程序,該應用程序在Apache Felix OSGi容器內運行(Web應用程序本身是一個OSGi Bundle)。現在,我們面臨以下問題:根據JSP 2.0規範,TLD(taglib描述符)不再需要駐留在Web應用程序的WEB-INF文件夾中,而是直接從taglib的jar文件中加載META- INF文件夾。這個taglib jar通常駐留在Web應用程序WEB-INF/lib文件夾中,但由於它們是OSGi包,它們由Felix加載。OSGi中的JSP:如何從捆綁包加載TLD?

在taglib的OSGi信息中,我們確實導入了所有需要的軟件包。任何人都知道如何告訴servlet,在加載的OSGi Bundle內搜索TLD?

感謝您的幫助!

+0

JSP容器是否在OSGI環境之外啓動,或者它是一個包? – 2010-07-23 13:38:13

+0

這是一個包。我們使用OPS4J Pax Web(http://wiki.ops4j.org/display/paxweb/Pax+Web) – Basil 2010-07-27 19:52:21

回答

3

Pax won't find your TLDs,如果他們在您的Web應用程序不同的捆綁產品:

標記庫

爲了讓您的自定義標籤庫的工作您的TLD文件將必須在到達你捆綁在「特殊」地方:

  • Bundle-ClassPath清單條目引用的任何jar中的所有tld文件
  • 在WEB-INF目錄或WEB-INF的子目錄中的所有TLD文件在你的包JAR

請注意,你導入的包不會被搜索(這可能是因爲這種支持將在稍後加入)

我在基於Struts的系統中遇到了這個問題,在這個系統中,我在多個webapp包之間共享一個OSGi-fied Struts包。 Web應用程序具有需要Struts taglib的JSP。

一個稍微不成熟的問題(因爲它將TLD複製到所有地方)解決方法是將TLD放入您的Web應用程序的META-INF目錄中,並使webapp bundle導入爲必需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> 
+0

Hanno,謝謝你的好解釋和有用的答案。我會在我們的環境中嘗試你的'黑客'。無論如何,我仍然希望「稍後會添加此支持」,正如OPS4J文檔中所述。 – Basil 2010-10-09 08:22:05

+1

從版本1.1.0開始Pax Web正在導入的捆綁包中搜索頂級域名 - 這正是我夢寐以求的:-) – Basil 2011-08-04 15:33:31

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工具。

相關問題