OSGi中的JSP:如何从bundle加载TLD?

时间:2010-07-16 13:07:25

标签: java jsp osgi taglib

我们正在构建一个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加载的。

在taglib的OSGi信息中,我们确实导入了所有需要的包。有谁知道如何告诉servlet,在加载的OSGi Bundles中搜索TLD?

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

Pax won't find your TLDs,如果它们与您的网络应用不同:

  

标记库

     

为了让您的自定义标记库工作,您的TLD文件必须可以在“特殊”位置的捆绑中访问:

     
      
  • Bundle-ClassPath清单条目引用的任何jar中的所有tld文件
  •   
  • WEB-INF目录中的所有tld文件或捆绑jar中WEB-INF的子目录
  •   
     

请注意,我们不会搜索您导入的软件包(稍后可能会添加此支持)

我在基于Struts的系统中遇到此问题,我在多个webapp捆绑包之间共享一个OSGi-fied Struts捆绑包。 Web应用程序具有需要Struts标记库的JSP。

略微hackish(因为它复制了TLD的所有地方)解决方法是将TLD放在webapp的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>

答案 1 :(得分: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。