2016-11-24 21 views
5

Chúng tôi đang xây dựng một tai sẽ chạy trên một Websphere nơi j2ee.jar được cung cấp.Nên lọ có "phụ thuộc" được cung cấp?

Bây giờ chúng ta có tình huống là một ejb (gọi nó là ejb.jar) phụ thuộc vào một cái bình khác (gọi nó là util.jar) phụ thuộc vào j2ee.jar.

Nếu đánh dấu j2ee.jar trong pom của util.jar là "được cung cấp", ejb.jar sẽ không xây dựng vì được cung cấp không phải là chuyển tiếp. Nếu chúng ta đánh dấu nó là "biên dịch", nó có thể trở thành sự phụ thuộc biên dịch của tai, trừ khi chúng ta ghi đè lên phạm vi.

Cách tiếp cận tốt nhất là gì? Nên util.jar đã cung cấp phụ thuộc, ngay cả khi nó chỉ là một cái lọ khiêm tốn? Hoặc nên lọ chỉ có phụ thuộc biên dịch?

+0

Giả sử bạn đang sử dụng một IDE dựa trên ecipse, bạn đã [thêm] (http://help.eclipse.org/kepler/index.jsp?topic=%2Forg.eclipse.wst.server.ui.doc.user%2Ftopics%2Ftwinstprf.html) Thời gian chạy tuân thủ WebSphere hoặc J2EE cho dự án? – Lightbeard

+0

Tôi thấy bạn đang xây dựng với maven, tôi nghĩ [this] (https://www.ibm.com/support/knowledgecenter/SS8PJ7_9.0.0/com.ibm.etools.maven.doc/topics/localrepo.html) là cách tương đương để thêm các lọ thời gian chạy liên quan – Lightbeard

+0

@Lightbeard Cảm ơn bạn đã bình luận của bạn, nhưng đây không phải là về xây dựng trong một IDE và nó cũng không phải là về việc phụ thuộc vào kho lưu trữ cục bộ.Điều này hoàn toàn là về câu hỏi làm thế nào để xây dựng poms một cách hữu ích và chính xác nếu phụ thuộc "được cung cấp" được sử dụng trong lọ transitive. –

Trả lời

2

JAR có thể đã cung cấp phụ thuộc ... nhưng người dùng có sự phụ thuộc vào nó cần phải đảm bảo rằng sự phụ thuộc này thực sự sẽ được cung cấp trong thời gian chạy. Vì các phụ thuộc được cung cấp không phải là transitive, chúng cũng cần đảm bảo rằng chúng không phụ thuộc vào nó để biên dịch; nhưng nếu thực hiện, thực hành tốt nhất là khai báo rõ ràng với phạm vi biên dịch (hoặc được cung cấp) và không dựa vào một số hình thức transitivity (xem mục tiêu analyze của Plugin phụ thuộc, ví dụ: danh sách được sử dụng, nhưng không khai báo, phụ thuộc).

  • Phụ thuộc được cung cấp trong JAR có thể hữu ích khi tạo JAR thực thi. Hãy xem xét việc xây dựng một uber-jar (một JAR với tất cả các lớp phụ thuộc vào nó): bạn có thể muốn nói rằng một sự phụ thuộc cụ thể không nên kết thúc trong uber-jar, bởi vì container khởi chạy nó sẽ cung cấp nó tại thời gian chạy.
  • Ngoài ra, một JAR có thể cần một sự phụ thuộc để biên dịch mã của nó, nhưng không thực sự cần nó để chạy; ví dụ, hãy xem xét các plugin Maven tuyên bố maven-plugin-annotations as a provided dependency vì chúng chỉ cần các chú thích được xây dựng.
  • Điểm cuối cùng, có các JAR có ý tưởng hay về ngữ cảnh mà chúng sẽ được sử dụng: Spring WebMVC, ví dụ, chắc chắn phụ thuộc vào API Servlet để biên dịch, nhưng vào thời gian chạy, nó biết nó sẽ được sử dụng trong ngữ cảnh Java EE và API Servlet sẽ được cung cấp bởi máy chủ Java EE.

Theo quy tắc chung, ngoài các trường hợp trên, có thể bạn không muốn cung cấp các phụ thuộc JAR bên trong dự án JAR: nó sẽ giúp khách hàng quyết định xem một số phụ thuộc biên dịch hay không của bạn sẽ được cung cấp cho trường hợp cụ thể của họ và để khách hàng ghi đè phạm vi. Là một nhà văn thư viện, bạn không thực sự biết làm thế nào thư viện của bạn sẽ được sử dụng.

Trong trường hợp cụ thể của bạn, vì ejb.jar thực sự cần j2ee.jar để biên dịch, nó sẽ là tốt nhất để tuyên bố rằng sự phụ thuộc với biên dịch, hoặc thậm chí với phạm vi cung cấp trong trường hợp của bạn, bất kể những gì phạm vi util.jar đã thiết lập cho j2ee.jar. (Tôi sẽ lưu ý rằng một JAR tiện ích có một sự phụ thuộc vào những gì dường như là một JAR từ các lớp ứng dụng web Java EE.)

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