2010-07-16 34 views
7

Chúng tôi đang xây dựng một ứng dụng web JSP, chạy bên trong thùng chứa Apache Felix OSGi (bản thân ứng dụng web là một gói OSGi). Bây giờ, chúng tôi đang đối mặt với vấn đề sau:JSP trong OSGi: Cách tải TLD từ các gói?

Theo thông số JSP 2.0, TLD (mô tả thẻ) không còn cần phải nằm bên trong thư mục WEB-INF của ứng dụng web nhưng được tải trực tiếp từ jar của taglib Thư mục INF. Các thẻ taglib này thường nằm bên trong thư mục WEB-INF/lib của ứng dụng web, nhưng vì chúng là các gói OSGi, chúng được Felix nạp.

Trong thông tin OSGi của thẻ tagl, chúng tôi nhập tất cả các gói cần thiết. Bất cứ ai ra khỏi đó làm thế nào biết làm thế nào để nói cho servlet, để tìm kiếm TLDs cũng bên trong gói OSGi nạp?

Cảm ơn sự giúp đỡ của bạn!

+0

Thùng chứa JSP có được đưa ra ngoài môi trường OSGI hay là một gói không? –

+0

Đó là một gói. Chúng tôi đang sử dụng OPS4J Pax Web (http://wiki.ops4j.org/display/paxweb/Pax+Web) – Basil

Trả lời

3

Pax won't find your TLDs, nếu họ đang ở trong một bó khác nhau từ webapp của bạn:

Tag Libs

Để có được libs thẻ tùy chỉnh của bạn làm việc file TLD của bạn sẽ phải có thể truy cập tại của bạn bó ở những nơi "đặc biệt":

  • tất cả các file trong bất kỳ tLD jar tham chiếu bởi bạn Bundle-classpath nhập manifest
  • tất cả các file tld trong thư mục WEB-INF hoặc thư mục con của thư mục WEB-INF trong bó jar của bạn

Xin lưu ý rằng gói nhập khẩu của bạn sẽ không được tìm kiếm (có thể là do sự hỗ trợ này sẽ được bổ sung sau này)

Tôi đang gặp sự cố này trong hệ thống dựa trên Struts nơi tôi chia sẻ gói Struts OSGi-fied giữa nhiều gói webapp. Các ứng dụng web có các JSP cần thẻ tag Struts.

Một chút hackish (vì nó sao chép TLD khắp nơi) giải pháp là đặt TLD vào thư mục META-INF webapp của bạn và thực hiện yêu cầu nhập gói webapp gói Struts (hoặc, nếu bạn không sử dụng Struts, bất kỳ lớp nào xử lý các thẻ). Điều này có thể được tự động hóa với Maven như sau:

<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, cảm ơn bạn đã giải thích tốt và câu trả lời hữu ích. Tôi sẽ thử 'hack' của bạn trong môi trường của chúng tôi. Dù sao, tôi vẫn hy vọng rằng "hỗ trợ này sẽ được thêm vào sau này", như đã nêu trong tài liệu OPS4J. – Basil

+1

Kể từ phiên bản 1.1.0 Pax Web đang tìm kiếm các TLD cũng trong các gói nhập - đó là những gì tôi đã mơ ước :-) – Basil

0

Nói chung, rất khó để tích hợp thư viện OSGi và Java EE. Mọi người từ Nuxeo CMS quản lý để tích hợp Seam Framework và OSGi, vì vậy tôi nghĩ rằng bằng cách sử dụng các ý tưởng của họ, bạn có thể tích hợp JSP TLD và OSGi là tốt, thậm chí dễ dàng hơn. Chỉ cần tải xuống Nuxeo và phân tích mã nguồn của nó: http://www.nuxeo.org/xwiki/bin/view/Main/

Tuy nhiên, tích hợp OSGi và Java EE nói chung là khó. Bạn có thực sự cần tích hợp thời gian chạy OSGi không. Có lẽ tích hợp biên dịch Maven sẽ đủ cho bạn? Nhiều người chỉ thấy Maven và các công cụ tương tự như thời gian biên dịch OSGi.

Các vấn đề liên quan