Làm thế nào để bạn xóa bộ nhớ cache của Apache Maven?


212

Gần đây, Apache Maven dường như đang gặp vấn đề về bộ nhớ đệm. Việc thực hiện cài đặt sạch trên các dự án của chúng tôi bằng Windows Vista hoặc Windows 7 đôi khi tạo ra các tạo phẩm có cùng dữ liệu với bản dựng trước đó mặc dù các tệp của tạo phẩm mới hơn đã được cập nhật.

Có cách nào để xóa bộ đệm này để buộc maven luôn kích hoạt một bản dựng sạch của tạo phẩm cục bộ nên được xây dựng không?

Đặc biệt, chúng tôi đang gặp sự cố khi xây dựng một ứng dụng web với plugin chiến tranh. Phiên bản Maven là 3.0.3. Phiên bản plugin chiến tranh là 2.1.1.


2
Bạn đã thử -Ucờ sẽ cập nhật hiện vật chưa?
Amir Raminfar

2
Bạn có thể cho biết thêm chi tiết? Là những người phụ thuộc không được cập nhật trong chiến tranh? Nếu vậy, những người phụ thuộc có phiên bản SNAPSHOT không?
Raghuram

Đây có phải là một dự án đa mô hình? Bạn đã kiểm tra số phiên bản của các mô-đun phụ thuộc chưa? Bạn có thể sinh sản? mvn clean installđưa cổ vật mới vào kho lưu trữ cục bộ?
palacsint

@ MetroidFan2002 Chúng tôi có thể vui lòng có câu trả lời được đánh dấu ở đây không. Hoặc bạn có thể viết một giải pháp nếu bạn tìm thấy bất kỳ một mình.
Naman

1
mvn clean install -Dmaven.repo.local=/alternate/repo/location
Gayan Weerakutti

Câu trả lời:


225

Xóa các hiện vật (hoặc toàn bộ repo cục bộ) từ c:\Users\<username>\.m2\repositorytay.


4
Đã thử nó rồi, không hoạt động. Nhờ đề nghị mặc dù.
MetroidFan2002

3
có vẻ như, ngay cả sau khi khởi động lại, một The action can't be completed because the folder or file in it is open in another program. Close the folder or file and try again.
đống

1
Lưu ý rằng vị trí thư mục có thể khác nhau trên hệ thống của bạn - xem câu trả lời này để biết cách lấy đường dẫn thư mục maven repo
jakub.g

9
@ liltitus27 tương tự ở đây, chỉ cần xóa sổ ~ / .m2 / kho lưu trữ không hoạt động, mvn dependency:purge-local-repositorycuối cùng đã hoạt động
qbert65536

vâng, điều này hiệu quả với tôi 100% - Windows10 trên mạng công ty với tư cách là người dùng không phải quản trị viên
Graeme Phillips

176

Để làm sạch bộ đệm cục bộ, hãy thử sử dụng trình cắm phụ thuộc.

  1. mvn dependency:purge-local-repository: Đây là một nỗ lực để xóa các tệp lưu trữ cục bộ nhưng nó luôn luôn đi và lấp đầy kho lưu trữ cục bộ sau khi mọi thứ đã bị xóa.
  2. mvn dependency:purge-local-repository -DreResolve=false: Điều này tránh việc giải quyết lại các phụ thuộc nhưng đôi khi vẫn truy cập mạng.
  3. mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false: Điều này đã được thêm vào bởi Paweł Prażak và dường như hoạt động tốt. Tôi sẽ sử dụng cái thứ ba nếu bạn muốn repo cục bộ trống rỗng, và cái đầu tiên nếu bạn chỉ muốn loại bỏ repo cục bộ và lấy lại các phụ thuộc.

4
sự khác biệt giữa chúng là gì?
Pieter De Bie

13
Đầu tiên là một nỗ lực để xóa các tệp lưu trữ cục bộ nhưng nó luôn luôn đi và lấp đầy kho lưu trữ cục bộ sau khi mọi thứ đã bị xóa. Thứ hai tránh việc giải quyết lại các phụ thuộc nhưng đôi khi vẫn đi đến mạng. Thứ ba đã được thêm vào bởi Paweł Prażak và dường như hoạt động tốt. Tôi sẽ sử dụng cái thứ ba nếu bạn muốn repo cục bộ trống rỗng, và cái đầu tiên nếu bạn chỉ muốn loại bỏ repo cục bộ và lấy lại các phụ thuộc.
Brian C.

Từ dòng lệnh trên một hệ thống linux. Bạn sẽ cần cài đặt mvn. maven.apache.org/install.html
Brian C.

Tôi sẽ thêm rằng bạn có thể nhắm mục tiêu các nhóm / tạo tác cụ thể với một tham số bổ sung. Câu trả lời này chắc chắn là những gì tôi đang tìm kiếm (tùy chọn 3). Dưới đây là thông số phụ ::: phụ thuộc mvn: thanh trừng địa phương-kho -DmanualInclude = "myGroupId" -DsnapshotsOnly = true -DactTransitively = false -DreResolve = false
granadaCoder

Tôi đã thử tùy chọn thứ 3 với mục đích xóa tất cả nội dung trong kho lưu trữ cục bộ , nhưng nó không hoạt động - cho đến thời điểm này, cách duy nhất để thực hiện mục tiêu này là xóa thủ công tất cả nội dung của thư mục đó. Tôi có kho lưu trữ cục bộ ở một vị trí khác với <User_Name>/.m2vị trí. Không chắc chắn nếu nó sẽ là lý do.
Manuel Jordan

13

Bạn đã kiểm tra / thay đổi cài đặt updatePolicy cho kho lưu trữ của bạn trong settings.xml.

Phần tử này chỉ định tần suất cập nhật sẽ cố gắng xảy ra. Maven sẽ so sánh dấu thời gian của POM cục bộ (được lưu trữ trong tệp siêu dữ liệu maven của kho lưu trữ) với điều khiển từ xa. Các lựa chọn là: luôn luôn, hàng ngày (mặc định), khoảng: X (trong đó X là số nguyên tính bằng phút) hoặc không bao giờ.

Cố gắng đặt nó thành always.


1
Có thể giúp đỡ về cách giải quyết vấn đề này ... Tôi không có <updatePolicy>trong tệp pom.xml của mình, nhưng có<snapshotPolicy>
Al Lelopath

updatePolicy được đặt ở mọi nơi trong cài đặt của tôi.
MasterJoe2

11

Tôi sẽ làm như sau:

mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false --fail-at-end

Các cờ báo cho maven không cố gắng giải quyết các phụ thuộc hoặc nhấn mạng. Xóa những gì bạn nhìn thấy tại địa phương.

Và đối với biện pháp tốt, bỏ qua lỗi ( --fail-at-end) cho đến cuối cùng. Điều này đôi khi hữu ích cho các dự án có tập hợp phụ thuộc hơi lộn xộn hoặc dựa vào kho lưu trữ nội bộ hơi lộn xộn (nó xảy ra.)


1
Là nó không đủ để chỉ đơn giản là xóa thư mục bộ nhớ cache cục bộ cho loại dọn dẹp này?

1
Bạn có thể nếu bạn biết mọi phụ thuộc bắc cầu duy nhất. Nhưng sau đó nó trở nên tẻ nhạt (hoặc chúng ta chỉ có thể xóa toàn bộ bộ đệm, nhưng điều đó sẽ buộc maven phải tải lại mọi thứ cho những thứ không liên quan đến vật phẩm trong câu hỏi.) Tất cả phụ thuộc vào chi tiết cụ thể của tình huống.
luis.espinal

6

Điều này hoạt động trên Spring Tool Suite v 3.1.0.RELEASE, nhưng tôi đoán nó cũng có sẵn trên Eclipse.

Sau khi xóa các tạo phẩm bằng tay (như đã nêu của palacsint ở trên) trong /username/.m2thư mục, hãy lập chỉ mục lại các tệp bằng cách thực hiện như sau:

Đi đến:

  • Windows->Preferences->Maven->User Settings thực đơn.

Nhấp vào Reindexnút bên cạnh Local Repositoryhộp văn bản. Nhấp vào "Áp dụng" rồi "OK" và bạn đã hoàn tất.


2

Như một số câu trả lời đã chỉ ra, đôi khi bạn thực sự muốn xóa hoàn toàn kho lưu trữ cục bộ, chẳng hạn, có thể có một số tạo tác không thể bị xóa vì chúng không còn được tham chiếu bởi pom nữa.

Nếu bạn muốn xóa phần này trong một pha maven, ví dụ như cleanbạn có thể sử dụng maven-clean-pluginvà truy cập kho lưu trữ thông qua các cài đặt, ví dụ:

 <plugin>
    <inherited>false</inherited>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.1</version>
    <executions>
        <execution>
            <phase>clean</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <tasks>
                    <echo>Base clean is attached to deleting local maven cache</echo>
                    <echo>${settings.localRepository}</echo>
                </tasks>
            </configuration>
        </execution>
    </executions>
</plugin>

<plugin>
    <inherited>false</inherited>
    <artifactId>maven-clean-plugin</artifactId>
    <version>3.1.0</version>
    <configuration>
        <filesets>
            <fileset>
                <directory>${settings.localRepository}</directory>
            </fileset>
        </filesets>
    </configuration>
</plugin>

2

Sử dụng mvn dependency:purge-local-repository -DactTransitively=false -Dskip=truenếu bạn có plugin maven là một trong các mô-đun. Nếu không, Maven sẽ cố gắng biên dịch lại chúng, do đó tải lại các phụ thuộc một lần nữa.


1
Đây thực sự là những gì tôi đang tìm kiếm, nó chỉ có một lỗi đánh máy (thiếu dấu gạch ngang để bỏ qua): mvn phụ thuộc: purge-local-repository -DactTransitively = false -Dskip = true
shoguren

0

Tôi đã có vấn đề tương tự, và tôi đã viết một lớp lót để làm điều đó.

rm -rf $(mvn help:evaluate -Dexpression=settings.localRepository\
                       -Dorg.slf4j.simpleLogger.defaultLogLevel=WARN -B \
                       -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn | grep -vF '[INFO]')/*

Tôi đã làm nó như một lớp lót vì tôi muốn có một dự án Jenkins chỉ đơn giản là chạy nó bất cứ khi nào tôi cần, vì vậy tôi sẽ không phải đăng nhập vào công cụ, v.v. Nếu bạn cho phép mình viết kịch bản shell cho nó, bạn có thể viết nó sạch hơn:

#!/usr/bin/env bash
REPOSITORY=$(mvn help:evaluate \
  -Dexpression=settings.localRepository \
  -Dorg.slf4j.simpleLogger.defaultLogLevel=WARN \
  -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn \
  --batch-mode \
  | grep -vF '[INFO]')

rm -rf $REPOSITORY/*

Nên hoạt động, nhưng tôi chưa thử tất cả kịch bản đó. (Tôi đã thử lệnh đầu tiên, nhưng không phải toàn bộ tập lệnh.) Cách tiếp cận này có nhược điểm là chạy lệnh phức tạp lớn trước. Nó là idempotent, vì vậy bạn có thể tự kiểm tra nó. Việc xóa là lệnh riêng của nó sau đó và điều này cho phép bạn thử tất cả và kiểm tra xem nó có làm như bạn nghĩ không, vì bạn không nên tin vào các lệnh xóa mà không cần xác minh. Tuy nhiên, nó thông minh vì một lý do chính đáng: Đó là hàng xách tay. Nó tôn trọng tệp settings.xml của bạn. Nếu bạn đang chạy lệnh này và bảo maven sử dụng một tệp xml cụ thể (đối số -s hoặc --sinstall), điều này sẽ vẫn hoạt động. Vì vậy, bạn không cần phải lo lắng về việc đảm bảo mọi thứ đều giống nhau ở mọi nơi.

Đó là một chút hiệu quả, nhưng đó là một cách kinh doanh tốt, IMO.


-3

Vì vậy, có một số lệnh mà bạn có thể sử dụng để làm sạch

 1. mvn clean cache   
 2. mvn clean install 
 3. mvn clean install -Pclean-database

cũng xóa thư mục kho lưu trữ từ .m2 có thể giúp đỡ.


1
"Bộ nhớ cache mvn sạch" phải làm gì? Nó dường như không phải là một lệnh được công nhận cho tôi.
AMTerp
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.