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

我们正在构建一个JSP Web应用程序,该应用程序在Apache Felix OSGi容器中运行(Web应用程序本身是一个OSGi包)。 现在,我们正面临以下问题:

根据JSP 2.0规范,TLD(taglib描述符)不再需要驻留在Web应用程序的WEB-INF文件夹内,而是直接从taglib的jar META-INF文件夹中加载。 这个taglib jar通常驻留在Web应用程序WEB-INF / lib文件夹中,但由于它们是OSGi包,它们由Felix加载。

在taglib的OSGi信息中,我们确实导入了所有需要的软件包。 任何人都知道如何告诉servlet,在加载的OSGi Bundle内搜索TLD?

谢谢你的帮助!


如果Pax与您的Web应用程序不同,它将无法找到您的顶级域名:

标签库

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

  • 所有由您的Bundle-ClassPath清单条目引用的jar文件中的所有tld文件
  • 您的捆绑包jar中的WEB-INF目录或WEB-INF的子目录中的所有tld文件
  • 请注意,您的导入的软件包不会被搜索(可能会在稍后添加此支持)

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

    一个有点冒失(因为它将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>
    

    一般来说,很难整合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工具。

    链接地址: http://www.djcxy.com/p/2079.html

    上一篇: JSP in OSGi: How to load TLD from bundles?

    下一篇: How do I tell linkify not to underline links?