Làm thế nào tôi có thể buộc lớp để tải lại phụ thuộc?


742

Làm thế nào tôi có thể nói với lớp để tải lại các phụ thuộc từ kho lưu trữ?

Câu trả lời:


845

Nói chung, bạn có thể làm mới các phụ thuộc trong bộ đệm của mình bằng tùy chọn dòng lệnh - phụ thuộc vào khung . Bạn cũng có thể xóa các tập tin lưu trữ dưới ~/.gradle/caches. Với bản dựng tiếp theo, Gradle sẽ cố tải xuống lại.

Trường hợp sử dụng cụ thể của bạn là gì? Bạn có sử dụng phiên bản phụ thuộc động hay phiên bản SNAPSHOT không?


Trên các hệ thống Unix, bạn có thể xóa tất cả các tạo phẩm hiện có (tạo tác và siêu dữ liệu) Gradle đã tải xuống bằng cách sử dụng:

rm -rf $HOME/.gradle/caches/

27
Tôi không thể nói cho OP, nhưng trường hợp sử dụng cụ thể của tôi là để kiểm tra xem cấu hình của kho lưu trữ không phải MavenCentral có thực sự hoạt động hay không.
Emil Lundberg

7
Bạn cũng cần xóa thư mục ~ / .m2 (nếu tồn tại). Nếu bạn đã cấu hình maven repo, một vài trong số các tạo phẩm đó cũng được tải xuống ~ / .m2. Tốt hơn là xóa cả ~ / .gradle và ~ / .m2 để bắt đầu trên bảng xếp hạng sạch.
Gopinath MR

17
Maven Local chỉ liên quan nếu bản dựng của bạn xác định nó là kho lưu trữ.
Benjamin Muschko

21
@Gopinath đó là lời khuyên nguy hiểm, vì .m2 có thể chứa tệp cài đặt maven. Tôi đoán bạn có nghĩa là xóa .m2 / kho lưu trữ
Phường

9
find $HOME/.gradle/caches/ -name "*LIBRARY_NAME*" -exec rm -r {} \;
fangzhzh

708

Nếu bạn đang sử dụng một phiên bản Gradle gần đây, bạn có thể sử dụng tùy chọn --refresh-phụ thuộc.

./gradlew build --refresh-dependencies

bạn có thể tham khảo hướng dẫn sử dụng Gradle .

Tùy chọn --refresh-phụ thuộc yêu cầu Gradle bỏ qua tất cả các mục được lưu trong bộ nhớ cache cho các mô-đun và tạo tác được giải quyết. Một quyết định mới sẽ được thực hiện đối với tất cả các kho lưu trữ được định cấu hình, với các phiên bản động được tính toán lại, các mô-đun được làm mới và các tạo phẩm được tải xuống.


10
Bạn phải lưu ý rằng vì gradle sẽ cố tải xuống tất cả các tệp phụ thuộc, nên mất nhiều thời gian.
Naga

11
Cũng đáng lưu ý rằng điều này không phải lúc nào cũng hoạt động. Tôi vừa thử nghiệm chạy "gradle Clear war --refresh-Depencies" với một cái hòm được lưu trữ đã được ba ngày tuổi, khi tôi đã triển khai một phiên bản mới vào tối hôm qua. Việc xây dựng bị phá vỡ vì một phụ thuộc bị thiếu đã được thêm vào trong mã mới. Tôi vẫn còn cái bình ba ngày tuổi trong bộ nhớ cache sau đó. Tôi đã kết thúc việc xóa thư mục phiên bản trong bộ nhớ cache .m2 và xây dựng lại. Sau đó, nó đã có phiên bản mới nhất vì về cơ bản nó không có lựa chọn!
Climby Quigman 22/03/2016

10
tốt hơn nữa chỉ là ./gradlew --refresh-
Depencies

1
Điều này hoạt động rất tốt khi './gradlew build --refresh-Depencies' từ thiết bị đầu cuối Android Studio. Cảm ơn!
the_dude_abides

2
Có cách nào để Android Studio thực hiện việc này trên bản dựng từ bên trong IDE không?
karl

313

Bạn có thể yêu cầu Gradle tải xuống lại một số phụ thuộc trong tập lệnh xây dựng bằng cách gắn cờ phụ thuộc là 'thay đổi'. Gradle sau đó sẽ kiểm tra các bản cập nhật cứ sau 24 giờ, nhưng điều này có thể được cấu hình bằng cách sử dụng DSL độ phân giải. Tôi thấy hữu ích khi sử dụng điều này cho các bản dựng SNAPSHOT hoặc NIGHTLY.

configurations.all {
    // Check for updates every build
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}

Mở rộng:

dependencies {
    implementation group: "group", name: "projectA", version: "1.1-SNAPSHOT", changing: true
}

Ngưng tụ:

implementation('group:projectA:1.1-SNAPSHOT') { changing = true }

Tôi tìm thấy giải pháp này tại chủ đề diễn đàn này .


4
Bạn có tình cờ biết cách này hoạt động cho các nguồn cho cùng một thư viện không? Hiện tại, thư viện đã biên dịch được tải xuống mỗi khi nó thay đổi, nhưng nguồn thì không.
Markus Wüstenberg

2
Một phiên bản chụp nhanh là "thay đổi" theo định nghĩa. Gradle biết rằng vì vậy bạn thực sự không cần phải xác định điều này trong tuyên bố phụ thuộc của mình.
Benjamin Muschko

4
Cám ơn vì cái này. FWIW, sự phụ thuộc của chúng tôi là vào một phiên bản chụp nhanh và cho đến khi chúng tôi làm điều này, nó không kiểm tra các bản cập nhật trên mỗi bản dựng.
phù hợp với

10
cacheChangingModulesForlà chìa khóa, changing: truelà tùy chọn vì nó ngụ ý -SNAPSHOT, có thể sử dụng tốc ký ở đây: compile 'group:projectA:1.1-SNAPSHOT'vì hàm ý trên. Người ta cũng có thể giới hạn độ phân giảiStrargety thành một cấu hình : configurations.compile.resolutionS....
TWiStErRob

2
@Umi Có phiên bản cô đọng này không? Chẳng hạn như compile 'com.burrowsapps:ads:1.0:true'?
Jared Burrows

63

Dành cho MAC

./gradlew build --refresh-dependencies

Cho cửa sổ

gradlew build --refresh-dependencies

Cũng có thể thử gradlew assembleDevelopmentDebug --refresh-dependencies


2
Android sử dụng lớp thường xuyên. Nó chỉ là một plugin.
Dragas

Trình bao bọc Gradle không phải là độc quyền của Android. Bạn có thể tạo một gradle wrappertác vụ bằng cách sử dụng ; bạn thậm chí có thể tạo một trình bao bọc bằng cách sử dụng trình bao bọc Gradle khác:gradlew wrapper
Salvioner

28

Đối với Windows ... để thực hiện tải lại phụ thuộc cụ thể :

  1. xóa các phụ thuộc bạn muốn tải xuống lại từ thư mục dưới đây:

    C:\Users\%USERNAME%\.gradle\caches\modules-2\files-2.1
    
  2. xóa tất cả các thư mục siêu dữ liệu tại đường dẫn:

    C:\Users\%USERNAME%\.gradle\caches\modules-2\metadata-*
    
  3. chạy gradle build(hoặc gradlew buildnếu sử dụng lớp bao bọc) trong thư mục gốc của dự án.

lưu ý: các số trong đường dẫn tệp ở trên có thể khác nhau đối với bạn.


19

Người ta có thể loại bỏ thư mục với các lọ được lưu trữ.

Trong trường hợp của tôi, trên Mac , thư viện đã được lưu trong đường dẫn:

/Users/MY_NAME/.gradle/caches/modules-2/files-2.1/cached-library-to-remove

Tôi đã xóa thư mục thư viện được lưu trong bộ nhớ cache ("bộ nhớ cache-thư viện để xóa" trong ví dụ trên), xóa thư mục xây dựng của dự án của tôi và biên dịch lại. Thư viện mới đã được tải về.


16

Thay vì xóa toàn bộ bộ đệm của lớp, như một số câu trả lời ở đây đang gợi ý, bạn có thể xóa bộ đệm cho một nhóm hoặc id tạo tác cụ thể. Tôi đã thêm chức năng sau vào .bash_profile:

deleteGradleCache() {
  local id=$1
  if [ -z "$id" ]; then
    echo "Please provide an group or artifact id to delete"
    return 1
  fi
  find ~/.gradle/caches/ -type d -name "$id" -prune -exec rm -rf "{}" \; -print
}

Sử dụng:

$ deleteGradleCache com.android.support

Sau đó, trên bản dựng tiếp theo hoặc nếu bạn đồng bộ lại, lớp sẽ tải lại phụ thuộc.


9

Có 2 cách để làm điều đó:

  1. Sử dụng tùy chọn dòng lệnh để làm mới phụ thuộc cashe.
  2. Bạn có thể xóa bộ nhớ cache cục bộ trong đó các thành phần được lưu trữ bằng Gradle và trình kích hoạt xây dựng

Sử dụng tùy chọn --refresh-phụ thuộc :

./gradlew build --refresh-dependencies

Giải thích ngắn - tùy chọn phụ thuộc vào khung sẽ cho Gradle bỏ qua tất cả các mục được lưu trong bộ nhớ cache cho các mô-đun và tạo tác được giải quyết.

Giải thích dài

  • Gradle của phụ thuộc WIthTHERrefresh sẽ luôn luôn truy cập máy chủ từ xa để kiểm tra các thành phần được cập nhật: tuy nhiên, Gradle sẽ tránh tải xuống một tệp trong đó cùng một tệp đã tồn tại trong bộ đệm.
    • Lớp đầu tiên sẽ thực hiện một yêu cầu CHÍNH và kiểm tra xem máy chủ có báo cáo tệp không thay đổi kể từ lần trước không (nếu 'độ dài nội dung' và 'lần sửa đổi cuối cùng' không thay đổi). Trong trường hợp này, bạn sẽ nhận được thông báo: "Tài nguyên được lưu trữ được cập nhật (lastModified: {})."
    • Gradle tiếp theo sẽ xác định tổng kiểm tra từ xa nếu có thể (từ yêu cầu CHÍNH hoặc bằng cách tải xuống tệp '.sha1'). Nếu tổng kiểm tra này khớp với một tệp khác đã được tải xuống (từ bất kỳ kho lưu trữ nào), thì Gradle sẽ chỉ sao chép tệp trong bộ nhớ cache, thay vì tải xuống lại. Trong trường hợp này, bạn sẽ nhận được thông báo: "Tìm thấy tài nguyên sẵn có tại địa phương với tổng kiểm tra phù hợp: [{}, {}].

Sử dụng xóa: Khi bạn xóa bộ nhớ cache

rm -rf $HOME/.gradle/caches/

Bạn chỉ cần dọn dẹp tất cả các lọ được lưu trong bộ nhớ cache và tổng sha1 và Gradle trong tình huống không có tạo tác nào trên máy của bạn và phải tải xuống mọi thứ. Có, nó sẽ hoạt động 100% lần đầu tiên, nhưng khi một SNAPSHOT khác được phát hành và nó là một phần của cây phụ thuộc của bạn, bạn sẽ phải đối mặt một lần nữa trước sự lựa chọn để làm mới hoặc xóa bộ nhớ cache.


9

Điều này làm việc cho tôi. Đảm bảo Gradle không được đặt thành ngoại tuyến bằng cách bỏ chọn nút tại Tệp> Cài đặt> Lớp> Công việc ngoại tuyến.

Thêm phần này vào cấp cao nhất của build.gradle của bạn, thật tuyệt khi có các phụ thuộc ở trên

configurations.all {
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}

Tôi chắc chắn rằng các phụ thuộc của tôi được viết như thế này:

implementation('com.github.juanmendez:ThatDependency:ThatBranch-SNAPSHOT') {
    changing = true
}

Sau đó, tôi mở bảng điều khiển Gradle trong Android Studio và nhấp vào nút mũi tên vòng tròn màu xanh. Tôi luôn có thể thấy các cập nhật của mình nhận được một bản sao mới.


9

Không có giải pháp nào ở trên làm việc cho tôi.

Nếu bạn sử dụng IntelliJ, điều giải quyết nó cho tôi chỉ đơn giản là làm mới tất cả các dự án Gradle:

nhập mô tả hình ảnh ở đây


7

Đối với những người đang tự hỏi nơi để chạy các lệnh gradle:

  1. Mở Android Studio
  2. Nhấp vào Terminal (Bạn sẽ tìm thấy nó trong cơ sở của Android Studio)
  3. Công cụ lệnh sẽ mở
  4. Nhập lệnh của bạn gradlew build --refresh-dependencies

6

Dành cho Android Studio 3.4.1

Chỉ cần mở tab gradle (có thể nằm ở bên phải) và nhấp chuột phải vào cha mẹ trong danh sách (nên được gọi là "Android"), sau đó chọn "Làm mới phụ thuộc".

Điều này sẽ giải quyết vấn đề của bạn.


4

Mb Tôi đã quá muộn tuy nhiên giải pháp của tôi là dành cho kho lưu trữ duy nhất. Tôi nghĩ việc xóa ~ / .gradle / * là quá mức cần thiết. Điều đáng tiếc tôi gặp phải là tôi đang xóa thư mục nơi các nguồn và lớp đang nhận được một phiên bản khác không phải từ nexus. Để tránh điều đó tôi chạy tiếp:

~/.gradle$ find . -type d -name 'group.plugins.awssdk'
./caches/modules-2/files-2.1/group.plugins.awssdk
./caches/modules-2/metadata-2.23/descriptors/group.plugins.awssdk

~/.gradle$ rm -r ./caches/modules-2/files-2.1/group.plugins.awssdk   ./caches/modules-2/metadata-2.23/descriptors/group.plugins.awssdk

Sau đó lớp đang kéo các tập tin từ nexus.


2

Để làm mới phiên bản 'phát hành' được lưu trong bộ nhớ cache, tùy chọn duy nhất là xóa bộ đệm cục bộ.

rm -rf $HOME/.gradle/caches/

Để làm mới phiên bản 'snapshot' được lưu trong bộ nhớ cache, bạn có thể:

./gradlew build --refresh-dependencies

1

Xóa tất cả các bộ nhớ cache làm cho tải xuống tất cả các phụ thuộc một lần nữa. Vì vậy, phải mất một thời gian dài và điều nhàm chán là chờ đợi một lần nữa để tải lại tất cả các phụ thuộc.

Bao giờ tôi có thể giải quyết điều này dưới đây.

Chỉ cần xóa các nhóm cần được làm mới.

Ví dụ: nếu chúng tôi muốn làm mới nhóm com.user.test

rm -fr ~/.gradle/caches/modules-2/files-2.1/com.user.test/

sau đó loại bỏ sự phụ thuộc khỏi build.gradle và thêm nó. sau đó nó sẽ làm mới phụ thuộc những gì chúng ta muốn.



0

xóa thư mục này:

C:\Users\[username]\.gradle

3
Cho rằng có khả năng cấu hình cục bộ, xóa, (hoặc đổi tên / định vị lại) thư mục cache như được đề cập trong các câu trả lời khác là một giải pháp tốt hơn.
thiểu

0

Đối với phần lớn các trường hợp, chỉ cần xây dựng lại dự án nên thực hiện thủ thuật. Đôi khi bạn phải chạy ./gradlew build --refresh-dependenciesnhư một số câu trả lời đã được đề cập (mất nhiều thời gian, tùy thuộc vào mức độ phụ thuộc của bạn). Tuy nhiên, đôi khi không ai trong số họ sẽ làm việc: sự phụ thuộc sẽ không được cập nhật. Sau đó, bạn có thể làm điều này:

  1. Xóa phụ thuộc khỏi tập tin lớp của bạn
  2. Chạy / gỡ lỗi dự án của bạn và chờ đợi nó thất bại (với NonExistingClasslý do)
  3. Nhấn "xây dựng dự án" và đợi nó kết thúc thành công
  4. Chạy / gỡ lỗi một lần nữa

Điều này thật vô lý và có vẻ như điên rồ, nhưng tôi thực sự sử dụng quy trình này hàng ngày, đơn giản vì sự phụ thuộc tôi cần có thể được cập nhật hàng chục lần và không có giải pháp thích hợp nào có hiệu lực.


0

Bạn có thể làm như thế này

https://marschall.github.io/2017/04/17/disabling-gradle-cache.html

Để trích dẫn từ Vô hiệu hóa bộ đệm ẩn Gradle Build

Bộ đệm xây dựng Gradle có thể là một điều tuyệt vời khi bạn thường xuyên xây dựng> các dự án lớn với Gradle. Tuy nhiên, khi chỉ thỉnh thoảng xây dựng các dự án nguồn mở> nó có thể nhanh chóng trở nên lớn.

Để vô hiệu hóa bộ đệm xây dựng Gradle, thêm dòng sau vào ~/.gradle/gradle.properties

org.gradle.caching=false

Bạn có thể xóa bộ nhớ cache hiện có với

rm -rf $HOME/.gradle/caches/
rm -rf $HOME/.gradle/wrapper/

0

Nếu bạn đang sử dụng nhật thực và nếu bạn muốn buộc nhật thực tải lại các phụ thuộc, bạn có thể thử lệnh bên dưới

gradlew clean cleaneclipse build eclipse --refresh-dependencies

2
Tại sao bạn lại sử dụng Eclipse? Đặc biệt là năm 2018!
Christopher Perry

0

Chỉ xóa thủ công các phụ thuộc cụ thể trong thư mục bộ đệm mới hoạt động ... một tạo tác được tạo bởi một đồng nghiệp trong repo doanh nghiệp.


0

Trong trường hợp của tôi, không có cách nào ở trên hoạt động, điều tôi đã làm là:

  • Trong build.gradle, nhận xét các phụ thuộc liên quan đến hàng nhập khẩu chưa được giải quyết mà tôi có
  • Nhấp vào "Đồng bộ hóa ngay"
  • Không chú ý đến những gì tôi vừa nhận xét
  • Nhấp vào "Đồng bộ hóa ngay" lần nữa

Sau đó, hàng nhập khẩu của tôi đã được giải quyết một lần nữa.


-7

Bạn cần tải xuống lại, để bạn có thể tải xuống và thay thế tệp bị hỏng theo cách thủ công và đồng bộ lại dự án của bạn. Đến vị trí này C: \ users [username] .gradle \ wrapper \ TP \ gradle3.3-tất cả \ 55gk2rcmfc6p2dg9u9ohc3hw9 \ gradle-3.3-all.zip Đây gradle3.3allzip xóa và thay thế nó bằng cách tải lại từ trang web này https: / /service.gradle.org/distribution/ Tìm cùng một tệp và tải xuống và dán nó vào vị trí đó Sau đó đồng bộ hóa dự án của bạn. Hi vọng nó có ích cho bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.