JSP в OSGi: как загрузить TLD из пакетов? - PullRequest
7 голосов
/ 16 июля 2010

Мы создаем веб-приложение JSP, которое запускается внутри контейнера Apache Felix OSGi (само веб-приложение является OSGi Bundle).Теперь мы столкнулись со следующей проблемой:

В соответствии со спецификацией JSP 2.0 TLD (дескрипторы taglib) больше не должны находиться в папке WEB-INF веб-приложений, а загружаются непосредственно из jar-файла taglibПапка META-INF.Эти jar-файлы taglib обычно находятся в папке WEB-INF / lib веб-приложений, но поскольку они являются пакетами OSGi, они загружаются Felix.

В информации OSGi taglib мы импортируем все необходимые пакеты.,Кто-нибудь знает, как сказать сервлету, чтобы искать TLD также в загруженных пакетах OSGi?

Спасибо за вашу помощь!

Ответы [ 2 ]

3 голосов
/ 07 октября 2010

Pax не найдет ваши TLD , если они находятся в комплекте, отличном от вашего веб-приложения:

Tag Libs

Для того чтобы ваши пользовательские теги работали, ваши файлы TLD должны быть доступны в вашем пакете в «особых» местах:

  • все файлы tld в любом фляге, на которую ссылается ваша запись манифеста Bundle-ClassPath
  • все tld файлы в каталоге WEB-INF или подкаталоге WEB-INF в вашем пакете jar

Обратите внимание, что ваши импортированные пакеты не будут найдены (возможно,эта поддержка будет добавлена ​​позже)

У меня возникла эта проблема в системе на базе Struts, где я разделяю пакет Struts, основанный на OSGi, между несколькими пакетами веб-приложений.В веб-приложениях есть JSP, для которых требуется тег библиотеки Struts.

Немного хакерский (потому что он копирует TLD повсеместно) обходной путь - поместить TLD в каталог META-INF вашего веб-приложения и сделать импорт пакета веб-приложения необходимым 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 голосов
/ 11 октября 2010

В целом, сложно интегрировать библиотеки 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 во время компиляции.

...