2012-03-05 29 views
6

Gần đây, chúng tôi đã di chuyển sang API Servlet 3.0. Vì chúng tôi đang phát triển một khuôn khổ đôi khi cần một vài thay đổi trong web.xml, các dự án dựa trên khuôn khổ của chúng tôi cần phải cập nhật web.xml của họ bất cứ khi nào thay đổi trong khuôn khổ được thực hiện.Sử dụng các đoạn web (API Servlet 3.0) trong môi trường dự án lớn

Servlet API 3.0 giới thiệu các đoạn Web mới mới, làm cho hành vi này được kết hợp lỏng lẻo và năng động hơn. Tôi tạo một web-fragment.xml và di chuyển tất cả nội dung của chúng tôi từ tệp web.xml trong đó. Vì vậy, các dự án hiện chỉ có để xác định web.xml và các khai báo bổ sung của riêng chúng.

<?xml version="1.0" encoding="UTF-8"?> 
<web-app 
    version="3.0" 
    metadata-complete="false" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
</web-app> 

Chúng ta phải sử dụng metadata-complete="false" để cho phép việc tìm kiếm Fragment trong lọ (khuôn khổ của chúng tôi có web-fragment.xml trong META-INF/.

Kể từ khi chúng tôi có nhiều phụ thuộc vào các khuôn khổ khác và các thư viện (khoảng 80-90) và metadata-complete="false" cũng gây nên tìm kiếm Chú thích nó chiếm đến không thể chấp nhận 12 giây để tìm kiếm thông qua tất cả các thư viện.

cơ chế vì nó là hoạt động tuyệt vời và tôi thích thực tế là chúng ta có nhiều decou lấy từ khuôn khổ của chúng tôi, nhưng thời gian khởi động là gây tử vong! Ngoài ra, chúng tôi phải tăng bộ nhớ có sẵn cho Tomcat từ -Xms256m -Xmx512m đến -Xms512m -Xmx1024m để bắt đầu mà không nhận được java.lang.OutOfMemoryError: Java heap space (do bộ xử lý chú thích được triển khai không hiệu quả của Tomcat (khoảng 50.000 lớp được lưu trong bộ nhớ cache)).


tôi biết rằng chúng tôi có thể vô hiệu hóa việc tìm kiếm chú thích trong thư viện, nhưng như chúng ta sử dụng chủ yếu của bên thứ ba mà không có metadata-complete="true" cờ, điều này cũng không phải là một lựa chọn.

Chúng ta có thể làm bất cứ điều gì để tắt tìm kiếm chú thích không? Hoặc chúng ta có thể buộc Servlet Container chỉ tìm kiếm trong các thư viện được khai báo cho web-fragment.xml?

Tôi thực sự muốn sử dụng tính năng phân đoạn web mới, nhưng với thời gian khởi động và bộ nhớ tăng thì điều này là không thể.

Trả lời

3

Bạn có thể tắt xử lý chú thích theo cấu hình cho các tệp JAR nhất định. Tôi chỉ sử dụng nó cho các tệp JAR, nó có thể không hoạt động để phát nổ WAR s. Nhìn vào <tomcat>/conf/catalina.properties, dòng 76 (Tomcat 7.0.22):

# List of JAR files that should not be scanned for configuration information 
# such as web fragments, TLD files etc. It must be a comma separated list of 
# JAR file names. 
# The JARs listed below include: 
# - Tomcat Bootstrap JARs 
# - Tomcat API JARs 
# - Catalina JARs 
# - Jasper JARs 
# - Tomcat JARs 
# - Common non-Tomcat JARs 
# - Sun JDK JARs 
# - Apple JDK JARs 
+0

Đây thực sự là giải pháp, cảm ơn bạn! Thật không may này sẽ là một giải pháp phụ thuộc thùng chứa servlet. Chúng tôi nhắm mục tiêu chạy trên mọi thùng chứa servlet, vì vậy giải pháp này không phải là một lựa chọn tốt cho chúng tôi. – codevour

+0

@codevour Bạn đã giải quyết vấn đề của mình trong thời gian chờ đợi như thế nào? – phant0m

0

Có một số thuộc tính hệ thống trong Tomcat cho phép kiểm soát quét JAR từ 7.0.30. Kiểm tra trang doc here.

Về cơ bản những cái là:

  • tomcat.util.scan.DefaultJarScanner.jarsToSkip
  • org.apache.catalina.startup.ContextConfig.jarsToSkip
  • org.apache.catalina.startup.TldConfig.jarsToSkip

Không chắc thời gian sớm nhất bạn có thể cài đặt chúng, có lẽ ContextListener là gì?

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