2015-10-08 14 views
7

Tôi hoàn toàn bối rối về cách tải lớp xảy ra trong tomcat. Vì vậy, hãy chịu với tôi nếu câu hỏi của tôi có vẻ ngu ngốc.Chum mùa xuân trong thư mục lib tomcat

Chúng tôi triển khai nhiều ứng dụng web mùa xuân trên máy chủ tomcat đơn lẻ. Để giảm bớt dấu chân bộ nhớ, chúng tôi nghĩ đến việc có các hộp điều khiển lò xo, ngủ đông và cơ sở dữ liệu trong thư mục lib tomcat để chúng được chia sẻ bởi tất cả các ứng dụng web.

Tôi bắt đầu bằng cách đánh dấu các phụ thuộc mùa xuân là provided và sao chép các lọ đó vào lib tomcat. Nhưng khi khởi động máy chủ, tôi bắt đầu nhận được nhiều ClassNotFoundErrors, như đối với commons-logging, commons-fileupload, jackson, vì vậy tôi phải di chuyển các jars này cũng như đến lib tomcat.

Nhưng sau đó điều này bắt đầu cảm thấy cá. Điều gì sẽ xảy ra nếu trong tương lai tôi thêm một phụ thuộc vào mùa xuân vào dự án của tôi, nói spring-data-cassandra. Tôi có cần phải di chuyển các lọ phụ thuộc của nó không? Điều này có thể là bất tận. Ngoài ra tôi có thể nhận được lỗi CNF khi chạy.

Tôi đã cố gắng theo dõi this liên kết và đưa trở lại bối cảnh mùa xuân và mùa xuân-web trở lại chiến tranh ứng dụng. Nhưng nó không hoạt động, có ClassNotFound trên một số lớp trong khi khởi tạo WebApplicationIntializer. Tôi đã cố gắng để hiểu thứ tự của classes getting loaded in tomcat, nhưng không thể hiểu được nhiều.

Sau đó, tôi tìm thấy một lời giải thích hoàn toàn khác cho JDBC driver loading, điều này mâu thuẫn với tất cả các giải thích khác và khiến tôi hoàn toàn bối rối.



Khi tôi đọc nhiều hơn, tôi nghĩ rằng nó không phải là một cách tiếp cận phải để di chuyển lọ mùa xuân đến lib tomcat, nhưng vẫn chưa có một lý do tốt. Và tại sao JDBC lại hoạt động? Ai đó có thể xin giải thích? Ngoài ra không classloader cho mỗi webapp tạo ra một bản sao của mỗi lớp?

Chỉnh sửa 1: Tôi đã biết rằng một số phụ thuộc là optional trong lọ mùa xuân và sẽ được yêu cầu nếu được sử dụng trong ứng dụng web của tôi. Vì vậy, web-web phụ thuộc vào thư viện jackson nhưng là tùy chọn cho ứng dụng của tôi. Vì vậy, tôi cần phải tìm ra tất cả các lọ được yêu cầu cho dự án của tôi và cũng được yêu cầu bởi mùa xuân, những lọ cần phải được chuyển đến lib tomcat.

Trả lời

1

Tôi sẽ cố gắng giải thích những gì tôi biết.

Khi bạn triển khai một WAR trên tomcat của bạn, việc nạp lớp sẽ xảy ra theo cách này:

  1. nhìn cho lớp để nạp trong WAR classloader bạn
  2. nếu không tìm thấy di chuyển để cha mẹ (tomcat/lib thư mục)

Điều gì xảy ra trong trường hợp của bạn là mùa xuân cũng có nhiều phụ thuộc, nếu bạn gói nó trong chiến tranh, phụ thuộc của nó cũng sẽ được đóng gói và mọi thứ đều hoạt động tốt. Nhưng vì bạn đã xác định mùa xuân như được cung cấp, tất cả các phụ thuộc của nó cũng được coi là được cung cấp, và khi bạn đặt nó vào thư mục/lib, mùa xuân có thể truy cập được, nhưng các phụ thuộc của nó thì không.

Những gì bạn cần làm là đặt tất cả phụ thuộc vào mùa xuân và phụ thuộc của phụ thuộc (v.v.) trong thư mục lib. Một giải pháp khác là xác định một WAR trung gian trong phân cấp tải lớp của bạn sẽ chứa tất cả các lib phổ biến của bạn.

+0

cảm ơn cho đầu vào. Có vẻ như các phụ thuộc đã tạo ra một vấn đề là 'tùy chọn'.Vì vậy, rất khó để tìm ra các phụ thuộc transitive tôi sẽ cần – sidgate

+0

Nếu bạn sử dụng maven để xây dựng WAR của bạn, nó gói tất cả các depitive transs vào WAR artifact. –

+0

không phải tất cả, phụ thuộc tùy chọn không được bao gồm – sidgate

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