2010-01-15 23 views
11

Chúng tôi có một ứng dụng chạy trong môi trường JRE. Ứng dụng này sử dụng một số lọ bên ngoài và chúng tôi đã đặt chúng trong thư mục JAVA_HOME/lib/ext. Điều này đã làm việc cho chúng tôi trong nhiều năm nhưng gần đây một lập trình viên mới gia nhập đội ngũ của chúng tôi và có vẻ nhấn mạnh rằng đây là một số điều tồi tệ để làm. Tôi không thể hiểu tại sao và tôi đang cố gắng thực hiện một số nghiên cứu trước khi tôi đào sâu hơn với nhà phát triển này. Có cái gì tôi đang thiếu ở đây?Việc đặt các jars bên ngoài vào thư mục JAVA_HOME/lib/ext là một điều xấu?

+11

Tặng tiền cho anh ta hoặc ít nhất là tiền thưởng. Không có trong tay của bạn, nói chuyện với các nhà quản lý. Nghiêm túc. –

Trả lời

18

Có - đó là điều xấu. Hãy suy nghĩ về nó: ứng dụng phụ thuộc vào JRE và một số lọ phụ. Nếu bạn cập nhật JRE thì sao? Sau đó, bạn phải nhớ sao chép các tệp vào JRE mới. Nếu bạn cần thiết lập ứng dụng trên một hệ thống mới thì sao? Bạn phải sao chép ứng dụng ở đó, và sau đó cũng nhớ sao chép các jars bên ngoài vào JRE trên hệ thống đó.

Cả hai vấn đề đó sẽ không thành vấn đề nếu bạn chỉ đóng gói ứng dụng đúng cách cùng với các lọ bên ngoài mà nó cần. Nếu bạn không thấy điều này, thì có lẽ nó không phải là vấn đề gì cả. Nhưng bạn vẫn nên biết ơn anh chàng mới vì đã chia sẻ ý kiến ​​của mình.

+2

Nó phụ thuộc nhiều vào việc sử dụng cá nhân/công ty của bạn. Đối với tôi, nó là một điều bình thường để kiểm tra thư mục mở rộng sau khi cập nhật để di chuyển các thư viện thường được sử dụng từ đây đến đó, ví dụ itext (pdf-creation), hoặc một biểu đồ-thư viện. Nếu có xung đột phiên bản, bạn muốn biết sớm và bạn cần biết điều đó trong cả hai trường hợp.Nhưng các bản cập nhật nhỏ trong thư viện cho các sửa lỗi sẽ dễ xử lý hơn nếu bạn thực hiện tại một nơi và không ở nhiều nơi. Nếu có một chương trình mà không thể xử lý như một thư viện cố định, bạn phải sửa chữa nó riêng lẻ. –

+0

Hoàn toàn đồng ý, nhưng bây giờ vấn đề là phải làm gì nếu nhiều ứng dụng của tôi dựa vào cùng một thư viện/jar. Tôi không muốn đặt một bản sao của lọ trong mỗi cái, bởi vì nếu thư viện cập nhật, tôi sẽ phải thay đổi cái lọ cho tất cả các ứng dụng của tôi. Tôi muốn đặt cái bình này vào một nơi mà tất cả các ứng dụng của tôi có thể truy cập nó. Có phải một nơi như vậy tồn tại không? Hoặc tôi có cần phải sử dụng classpath (vấn đề là nếu tôi quyết định di chuyển jar, tôi cần phải thay đổi classpath cho tất cả các ứng dụng của tôi ...)? – Benitok

10

Ngoài câu trả lời của weiji (đóng gói và nâng cấp lên phiên bản JVM mới), có những rủi ro khác.

Nếu bạn đang sử dụng trình quản lý bảo mật trong bất kỳ ứng dụng nào của mình, các thư viện trong ext thường có nhiều khả năng hơn theo mặc định - chúng được xử lý giống như thư viện hệ thống. Bạn cần phải chắc chắn rằng bạn có thể tin tưởng, theo nghĩa thi hành các quy tắc bảo mật, các lớp này. Các tác giả có nghĩ đến những gì họ phơi bày chính xác không? Nếu các lớp này không sử dụng điều khiển truy cập để thay đổi bối cảnh bảo mật thì bạn không cần phải lo lắng về điều này nhưng bạn có biết chúng có làm hay không (ví dụ phương thức cung cấp quyền truy cập vào một tệp và sử dụng AccessController. người gọi có quyền truy cập tập tin đúng không?)

Tất cả các ứng dụng của bạn có thể sử dụng cùng một phiên bản thư viện không? Điều gì xảy ra khi bạn cần cập nhật thư viện đó (không chỉ JVM)? Bạn sẽ phá vỡ bất kỳ ứng dụng của bạn? Bạn sẽ cần kiểm tra lại mọi thứ. Các thư viện trong bộ nạp lớp mở rộng được tải bởi trình phụ huynh, có quyền ưu tiên cao hơn trình tải bình thường (tức là CLASSPATH) để chúng được ứng dụng của bạn đảm bảo và không có cách nào cho một ứng dụng riêng lẻ để ghi đè thư viện trong ext bằng một phiên bản khác.

Nếu bạn muốn chia sẻ thư viện trên các ứng dụng của mình, tại sao không cung cấp thư mục chung của các thư viện chung mà ứng dụng có thể được cấu hình riêng (CLASSPATH) để tham chiếu. Sau đó, nếu bạn gặp vấn đề với một ứng dụng và một thư viện, bạn có thể chuyển sang một phiên bản khác của thư viện hoặc chỉ cho một thư viện, đặt nó trước đó trong CLASSPATH (nếu nó hoạt động, bạn phải kiểm tra điều này. vấn đề). Điều này sẽ cho phép bạn có nhiều điều khiển riêng cho từng ứng dụng. Nhưng sau đó, việc gộp tất cả các thư viện được yêu cầu với ứng dụng của bạn là an toàn nhất vì bạn có thể thử lại và triển khai các bản nâng cấp thư viện cho các ứng dụng riêng lẻ.

1

Ngoài ra, có vẻ như JEP-220 có vẻ không chấp nhận hành vi này với một số phương tiện tùy ý để "có thể thay thế" bằng một số hành vi khác.

+0

- không nín thở! - –

+0

Trên thực tế, các khía cạnh của Java SE đối với cơ chế mở rộng đã không được chấp nhận trong bản phát hành bảo trì của JSR 337 (JSR cho Java SE 8) và sau đó được loại bỏ trong Java SE 9/JDK 9. Dòng lệnh '-XX: + CheckEndorsedAndExtDirs' tùy chọn là một tùy chọn hữu ích để kiểm tra xem các ứng dụng chạy trên JDK 8 có phụ thuộc vào tính năng này hay không. –

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