2010-07-16 60 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工具。