2015-06-09 26 views
5

Tôi có build.gradle trước mặt tôi và có một số phụ thuộc được khai báo là provided nhưng trong documentation Tôi không thấy phạm vi phụ thuộc này.'Được cung cấp' phụ thuộc trong Gradle

dependencies { 
    compile("org.springframework.boot:spring-boot-starter-web:1.2.4.RELEASE") 
    .... 

    provided 'backport-util-concurrent:backport-util-concurrent:3.1' 
    provided 'org.javolution:javolution:[email protected] 
    .... 
} 

Điều này có được cung cấp bởi plugin không? Nếu vậy làm thế nào để tôi phát hiện ra plugin này thuộc về?

Sự khác nhau giữa providedruntime phạm vi phụ thuộc trong Gradle là gì?

+1

Bạn có cấu hình có tên 'được cung cấp' không? – Opal

+0

Tôi nghĩ rằng tôi không hiểu những gì loại cấu hình bạn có nghĩa là. –

+0

Tôi có nghĩa là một mục được gọi là 'được cung cấp' trong khối' cấu hình'. Bạn có thể dán toàn bộ tập lệnh 'build.gradle' không? – Opal

Trả lời

16

Phạm vi provided là gì?

Giả sử rằng cần jar để biên dịch mã của bạn, nhưng bình có trong bộ sưu tập thư viện môi trường sản xuất. Sau đó, bạn không cần phải gói jar với lưu trữ dự án của bạn. Để hỗ trợ yêu cầu này, Maven có một phạm vi có tên là provided. Nếu bạn khai báo bất kỳ phụ thuộc jar nào là provided, thì bình này sẽ có mặt trong đường dẫn lớp của bạn trong khi biên dịch nhưng sẽ không được đóng gói với kho lưu trữ dự án của bạn.

provided phạm vi rất hữu ích, đặc biệt trong các ứng dụng web. Ví dụ: servlet-api.jar là cần thiết để có mặt trong classpath của bạn để biên dịch dự án của bạn, nhưng bạn không cần điều này để đóng gói servlet-api.jar tệp với war của mình. Với provided phạm vi một có thể đạt được yêu cầu này.

Không có Phạm vi nào được xác định trong Gradle java plugin có tên provided. Cũng không có trong số war hoặc android plugin. Nếu bạn muốn sử dụng phạm vi provided trong dự án của mình, thì bạn phải xác định nó trong tệp build.gradle của mình. Sau đây là đoạn mã để khai báo provided phạm vi trong gradle:

configurations { 
    provided 
} 

sourceSets { 
    main { compileClasspath += configurations.provided } 
} 

Bây giờ, câu hỏi thứ hai của bạn:

chênh lệch giữa cung cấp và phạm vi phụ thuộc thời gian chạy trong Gradle là gì?

Để trả lời câu hỏi này trước tiên, tôi sẽ xác định phụ thuộc compile. compile phụ thuộc là phụ thuộc, những người cần thiết để biên dịch mã của bạn. Bây giờ hãy tưởng tượng rằng nếu mã của bạn sử dụng một thư viện có tên là X thì bạn phải khai báo X làm phụ thuộc thời gian biên dịch của bạn. Ngoài ra, hãy tưởng tượng rằng X sử dụng một thư viện khác Y nội bộ và bạn đã khai báo Y làm phụ thuộc thời gian chạy của bạn.

Trong khi biên dịch, Gradle sẽ thêm X vào đường dẫn lớp của bạn nhưng sẽ không thêm Y. Kể từ khi, Y là không cần thiết để biên dịch. Nhưng nó sẽ đóng gói cả XY với lưu trữ dự án của bạn vì cả hai XY là cần thiết để chạy lưu trữ dự án của bạn trong môi trường sản xuất. Nói chung, tất cả các phụ thuộc cần thiết trong môi trường sản xuất được gọi là phụ thuộc runtime.

Trong Gradle chính thức documentation, nó nói rằng runtime phụ thuộc là "sự phụ thuộc theo yêu cầu của lớp học sản xuất trong thời gian chạy. Theo mặc định, cũng bao gồm thời gian phụ thuộc biên dịch.".

Bây giờ, nếu bạn đã đọc từ xa, thì bạn đã biết rằng provided là phụ thuộc compile mà chúng tôi không muốn có mặt trong sự phụ thuộc runtime (về cơ bản, chúng tôi không muốn gói đó dự án lưu trữ).

Sau đây là hình minh họa của các phạm vi providedruntime. Ở đây, compile đề cập đến các phụ thuộc được yêu cầu để biên dịch dự án và non-compile đề cập đến các phụ thuộc không bắt buộc để biên soạn dự án.

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