2012-06-27 28 views
5

Tại sao bạn muốn khai báo JAXB như là một sự phụ thuộc của ứng dụng Java của bạn vì nó vẫn được vận chuyển với JRE và không thể được overriden trong classpath ứng dụng của bạn?Khai báo JAXB là phụ thuộc. Tại sao?

Sử dụng jersey-json làm ví dụ, trong tệp POM của chúng, chúng khai báo sự phụ thuộc vào jaxb-impl mà không chỉ định phiên bản chính xác ngay cả. Họ đang làm gì bằng cách làm điều này?

Và cũng có thể, khi tôi thêm phụ thuộc vào jersey-json vào tệp POM của riêng mình, tôi sẽ có jaxb-api.jar và jaxb-impl.jar trong đường dẫn lớp của mình. Tại sao tôi muốn điều này xảy ra? Việc triển khai JVM mặc định có được tải không nếu tôi không đặt các tệp vào thư mục thư viện được xác nhận?

+0

Có thể cung cấp cho các vị trí chính xác nơi bạn tìm thấy thông tin về pom's etc? – khmarbaise

+0

Đã thêm liên kết vào tệp pom của jersey-json. – Muton

Trả lời

0

Âm thanh đó giống như người áo đã xác định sự phụ thuộc của họ sai. Nếu một phụ thuộc được cung cấp bởi môi trường nơi bạn chạy nó phải được định nghĩa với phạm vi "được cung cấp".

+1

Nhưng tại sao bạn lại có nó ngay cả khi "được cung cấp" trong trường hợp này vì nó được đóng gói trong chính rt.jar? – Muton

+0

Không. Nguyên nhân bạn cần nó là phụ thuộc biên dịch. Nhưng nếu bạn chắc chắn luôn sử dụng Java 1.6 hơn bạn thực sự không cần nó. – khmarbaise

1

tôi nhìn thấy trong pom liên kết:

<dependency> 
     <groupId>com.sun.xml.bind</groupId> 
     <artifactId>jaxb-impl</artifactId> 
    </dependency> 

Nhưng đó cũng là một pom mẹ, vì vậy bạn có thể muốn làm theo mà đường mòn lên, để xem nếu một phiên bản và/hoặc phạm vi thực tế đã được chỉ định ở đó (và tuyên truyền xuống).

Nhưng nếu không, thì tôi đoán nhóm Jersey cảm thấy rằng API JAXB 2 đủ chín chắn để cho phép họ chỉ định sự phụ thuộc lỏng lẻo vào việc triển khai JAXB.

Tàu JRE có triển khai cụ thể của impl JAXB, tương đương với JAXB RI 2.1.7 trong thời gian dài nhất. Nhưng đồng thời, có một cơ chế để dễ dàng hoán đổi cho một triển khai khác mà bạn chọn, trong ứng dụng của bạn.

Chắc chắn bạn có thể sử dụng triển khai JREB JRE được cài sẵn và nếu nó hoạt động cho ứng dụng của bạn, bạn chắc chắn nên thử.

Tuy nhiên, một số lý do có thể khiến bạn muốn triển khai JAXB riêng biệt bao gồm: lỗi trái (được giải quyết trong bản phát hành mới hơn); cần một API JAXB mới hơn như JAXB 2.2.x (có phiên bản mới hơn của JRE); muốn sử dụng một triển khai khác hoàn toàn (vì nó xảy ra để có API và/hoặc hiệu suất tốt hơn cho việc sử dụng cụ thể của bạn), v.v ...

Quay lại câu hỏi của bạn, tôi đoán lại rằng họ muốn cung cấp cho các nhà phát triển sự linh hoạt để kéo trong JAXB impl của họ về sự lựa chọn. Tôi nghĩ rằng họ có một số mức độ khuyến nghị ở đâu đó trong hướng dẫn của họ. Tuy nhiên, thực tế là JAXB RI được đánh dấu cụ thể dưới dạng phụ thuộc, cắt xén đối số.

+0

Trong bố mẹ, phạm vi không được xác định dẫn đến sự phụ thuộc vào dự án của bạn. – khmarbaise

+1

Cảm ơn bạn đã giải thích nhưng điều này vẫn không làm rõ nó hoàn toàn cho tôi. Theo hiểu biết của tôi, bạn không thể chỉ đơn giản là ghi đè lên phiên bản kèm theo JRE bằng cách thêm một phiên bản khác vào classpath của bạn vì điều này bạn cần sử dụng cơ chế ghi đè tiêu chuẩn được xác nhận (http://docs.oracle.com/javase/7/docs/technotes/hướng dẫn/tiêu chuẩn). Hay tôi hoàn toàn nhầm lẫn ở đây? Tôi hiểu rằng đối với dự án Jersey, phiên bản JAXB chính xác tạo ra nhiều khác biệt nhưng tôi không hiểu cách họ có thể quản lý nó trong tệp pom của họ và tại sao họ xác định nó như là một phụ thuộc thời gian biên dịch. – Muton

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