2009-06-04 21 views
7

Tôi nhấn vào hành vi khó chịu này trên JBoss 4.2 trong QA, và tôi muốn nhét nó vào chồi trước khi chúng tôi đi vào sản xuất và tìm một số trường hợp góc khác.Làm thế nào bạn có thể buộc biên dịch lại jsps trong JBoss 4.2?

Một jsp Calles một phương pháp mà có chữ ký sau đây:

public void methodName(String arg) 

này đã được đổi thành:

public void methodName(String arg, Object... args) 

Một JSP từ trước gọi là phương pháp này qua:

methodName("param"); 

Khi triển khai mã đã sửa đổi, JBoss không biên dịch lại JSP và điều này gây ra sự cố trong QA. Thêm một bình luận ngớ ngẩn cho jsp đã sửa lỗi (JBoss nhận ra rằng JSP đã thay đổi và biên dịch lại nó).

Có cài đặt trên JBoss để buộc biên dịch lại các JSP khi khởi động lại không?

EDIT: Để làm rõ một số điểm trong câu trả lời, thiết lập là JSP là một phần của cuộc chiến là một phần của tai. Tai có tất cả các lớp trong đó, trong một cái lọ.

Về mong muốn biên dịch trước, nếu hệ thống không nghĩ rằng jsp cần biên dịch, sẽ biên dịch lại biên dịch lực? Nó không có vẻ như vậy. Lỗi ở đây không phải là một lỗi compliation, nó là một lỗi gọi phương thức vì chữ ký "thay đổi" (ở cấp mã byte, không thực sự ở cấp mã).

Phụ lục: Lưu ý rằng chúng tôi đã trải nghiệm trong sản xuất gần đây rằng ngay cả với cờ của câu trả lời được chấp nhận, các JSP không biên dịch lại, mặc dù JSP đã thực sự thay đổi. Lỗi lớn ở đó, nhưng bất kể, JBoss đã tắt máy bình thường. Tại thời điểm này nó là nhận được một phiên bản cũ của JBoss, nhưng nếu bạn vẫn còn sử dụng nó, xóa nội dung của thư mục công việc và tmp là cách duy nhất để chắc chắn.

Tôi không thay đổi câu trả lời được chấp nhận đơn giản chỉ vì nó thực sự đến điểm của câu hỏi đang tìm kiếm. Lỗi JBoss là một vấn đề riêng biệt.

Trả lời

11

Nếu JSP là một phần của WAR là một phần của một EAR đang được triển khai như một lọ, sau đó tôi không rõ tại sao JSP của bạn không được biên dịch lại. Không phải JSP trong tệp chiến tranh có dấu thời gian mới hơn so với tệp lớp được biên dịch JBoss của họ từ lần triển khai cuối cùng không? Nếu không, bạn không thể chạm vào JSP như một phần của việc xây dựng WAR/EAR trước khi triển khai. [Tôi đang đề cập đến việc sử dụng lệnh "cảm ứng" của Unix, không chạm vào từng tệp JSP theo cách thủ công.]

Hoặc, thiết lập DeleteWorkDirOnContextDestroy trong $ JBOSS/server/default/deploy/jboss-web.deployer/META-INF /jboss-service.xml có thể là những gì bạn đang tìm kiếm. Nó là false theo mặc định, nhưng thiết lập nó thành true có thể là những gì bạn cần. Tôi nghĩ rằng điều này sẽ xóa các tập tin lớp JSPs trên redeploy để họ có được tái tạo khi truy cập đầu tiên của mỗi JSP.

Xem https://jira.jboss.org/jira/browse/JBAS-3358 để biết thêm thông tin.

+1

Tuyệt vời! Tôi sẽ kiểm tra xem nó hoạt động, và nếu nó chấp nhận câu trả lời. – Yishai

+5

+1 Cảm ơn! Chỉ cần lưu ý trong JBoss 5.1.0GA tập tin tương đương là $ JBOSS/server/default/deplyers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml –

+1

Cảm ơn, điều này giải quyết được một vấn đề tôi đã có với những thay đổi jsp không được phản ánh sau khi triển khai. –

1

Tôi không biết cài đặt, nhưng việc xóa tệp lớp Java được tạo trong thư mục công việc của cá thể JBoss của bạn sẽ làm cho JSP được biên dịch lại vào lần tiếp theo được gọi.

+1

Xin cảm ơn, nhưng điều đó sẽ khó thực hiện trong quá trình triển khai sản xuất. – Yishai

1

Bạn coudl thay đổi tập lệnh khởi động JBoss để xóa một cách rõ ràng thư mục "tmp" và/hoặc "cơ quan", nơi lưu trữ JSP được biên dịch. JBoss sau đó sẽ không có lựa chọn nào khác ngoài việc biên dịch lại tất cả.

Không tinh tế, nhưng nó sẽ thực hiện công việc.

0

Một tùy chọn cho bạn sẽ là biên dịch trước tất cả các jsp của bạn tại thời gian xây dựng. Điều này sẽ nhanh chóng gắn cờ bất kỳ lỗi biên dịch nào.

Bạn cũng có thể làm điều này trong sản xuất - tăng tốc truy cập đầu tiên nhưng tôi có cảm giác bạn muốn điều này nhiều hơn cho một bước QA hơn bất kỳ điều gì khác. Nếu vậy, bạn có thể thêm bước biên dịch trước vào giai đoạn thử nghiệm của bạn trong công cụ xây dựng mà bạn chọn - và như vậy đối với môi trường CI của bạn. Điều này sẽ đảm bảo rằng jsp không biên dịch sẽ không làm cho nó không được kiểm tra.

Xem này để biết chi tiết về chạy một nhiệm vụ precompile:

Jboss Jasper configuration

Hope this helps.

+0

Cảm ơn, chúng tôi thực sự thực hiện điều này. Vấn đề là xây dựng kịch bản tuân thủ sạch sẽ, và trong một biên dịch sạch sẽ, ví dụ là tốt. Vấn đề ở đây là JSP cơ bản cần được biên dịch lại để làm việc mặc dù nó không thay đổi, và việc biên dịch lại sẽ hoạt động, nhưng JSP sẽ không hoạt động mà không biên dịch lại. – Yishai

+0

Đủ công bằng sẽ không tìm thấy lỗi này khi xây dựng. Bạn đã xem xét biên dịch trước về sản xuất chưa? – Pablojim

+0

Làm thế nào để bạn biên dịch trước khi sản xuất (bạn sử dụng cài đặt nào)?Nó sẽ biên dịch lại mọi thứ? – Yishai

0

Một số vùng chứa JSP (theo phần 8.4.2 của đặc tả JSP 1.2) hỗ trợ khả năng biên dịch trước trang JSP.

Để precompile một trang JSP, truy cập trang web với một chuỗi truy vấn của? Jsp_precompile

http://hostname.com/mywebapp/mypage.jsp?jsp_precompile 

Các trang JSP sẽ không được thực thi. Nếu vùng chứa hỗ trợ biên dịch trước, trang JSP sẽ được biên dịch nếu cần.

Xem thêm http://www.rgagnon.com/javadetails/java-0414.html

0

Pablojim đang đi đúng hướng. Bạn chỉ cần thêm một số thông tin để có cái nhìn toàn diện về những gì đang xảy ra. Đây là cách tôi hiểu nó.

Trong sản phẩm, bạn đã thay đổi một jsp yêu cầu các jps khác phải được biên dịch lại. Để chúng được biên dịch lại, một trong 2 điều phải xảy ra

  1. Cần xóa phiên bản đã biên dịch của jsp.
  2. Các jsp bản thân cần phải được sửa đổi (hoặc thậm chí nếu nó "chạm" - ngày sửa đổi được cập nhật)

Nếu bạn vẫn cần phải xác minh rằng tất cả các JSP của bạn làm việc, tất cả họ sẽ cần phải được precompiled using an ant task. điều này cũng cho phép bạn triển khai tệp chiến tranh với jsps được biên dịch sẵn trong tệp chiến tranh. Điều này sẽ giải quyết vấn đề của bạn.

Nếu tệp của bạn không được triển khai trong tệp chiến tranh, nhưng ở định dạng được phát, bạn nên seriously consider packaging your web app trong tệp chiến dịch để triển khai. Điều này làm cho nó trở thành một gói tốt đẹp để triển khai giữa các môi trường.

+0

Nó được triển khai trong một cuộc chiến, và tôi xác minh với sự biên dịch trước, nhưng kết quả của quá trình biên dịch trước chỉ bị vứt đi, vì vậy JBoss đang đưa ra quyết định riêng về biên dịch lại, và trong trường hợp này không đủ mạnh. – Yishai

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