Làm cách nào để buộc Maven sử dụng kho lưu trữ cục bộ của tôi thay vì đi ra ngoài kho lưu trữ từ xa để truy xuất hiện vật?


97

Tôi đang sử dụng Maven 3.3.3 với Java 8 trên Mac Yosemite. Tôi có một dự án nhiều mô-đun.

    <modules>
            <module>first-module</module>
            <module>my-module</module></modules>

Khi tôi xây dựng một trong các mô-đun con của mình, chẳng hạn như “mô-đun của tôi” từ bên trên, sử dụng “mvn clean install”, bản dựng sẽ cố gắng tải xuống các tạo tác mô-đun con từ kho lưu trữ từ xa mà tôi đã xác định trong ~ / .m2 tệp /settings.xml. Đầu ra là bên dưới

[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building my-module 87.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml (788 B at 0.9 KB/sec)
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-20151104.200545-4.pom

Làm cách nào để buộc Maven phải kiểm tra kho lưu trữ ~ / .m2 / cục bộ của tôi trước khi cố gắng tải xuống từ các kho lưu trữ từ xa? Dưới đây là nơi tôi xác định các kho lưu trữ từ xa trong tệp ~ / .m2 / settings.xml của mình…

<profile>
    <id>releases</id>
    <activation>
        <property>
            <name>!releases.off</name>
        </property>
    </activation>
    <repositories>
        <repository>
            <id>releases</id>
            <url>https://my.remoterepository.com/nexus/content/repositories/releases/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</profile>
<profile>
    <id>snapshots</id>
    <activation>
        <property>
            <name>!snapshots.off</name>
        </property>
    </activation>
    <repositories>
        <repository>
            <id>snapshots</id>
            <url>https://my.remoterepository.com/nexus/content/repositories/snapshots/</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
</profile>

Chỉnh sửa: Đáp lại câu trả lời nói rằng quá trình tải xuống xảy ra khi phần mềm không có ở đó, bên dưới là kết quả đầu cuối mà tôi chứng minh tệp đã ở đó trong kho lưu trữ của tôi nhưng Maven vẫn cố tải xuống ...

Daves-MacBook-Pro-2:my-module davea$ ls -al ~/.m2/repository/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-SNAPSHOT.jar 
-rw-r--r--  1 davea  staff  10171 Nov  5 10:22 /Users/davea/.m2/repository/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-SNAPSHOT.jar
Daves-MacBook-Pro-2:my-module davea$ mvn clean install
[INFO] Scanning for projects...
[WARNING] 
[WARNING] Some problems were encountered while building the effective model for org.mainco.subco:my-module:jar:87.0.0-SNAPSHOT
[WARNING] 'build.plugins.plugin.(groupId:artifactId)' must be unique but found duplicate declaration of plugin org.apache.maven.plugins:maven-antrun-plugin @ org.mainco.subco:my-module:[unknown-version], /Users/davea/Documents/sb_workspace/my-module/pom.xml, line 678, column 12
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING] 
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building my-module 87.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml (788 B at 0.8 KB/sec)
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-20151106.043202-8.pom
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-   module-87.0.0-20151106.043202-8.pom (3 KB at 21.9 KB/sec)
Downloading: http://download.java.net/maven/2/org/mainco/subco/subco/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/subco/87.0.0-SNAPSHOT/maven-metadata.xml

2
Maven không kiểm tra kho lưu trữ địa phương trước khi cố gắng để tải về một artifact từ một kho lưu trữ từ xa. Bạn có chắc địa phương của bạn có những hiện vật này trước khi bạn thử xây dựng này không? Bạn có thể kiểm tra kho lưu trữ cục bộ của mình ngay bây giờ và vẫn thử bản dựng khác. Ngoài ra, bạn có thể chỉ định vị trí kho lưu trữ cục bộ của mình trong settings.xml(xem tại đây ).
mystarrocks

Mặc dù tôi chưa chỉ định kho lưu trữ của mình trong tệp settings.xml, nhưng đó là mặc định mà Maven thiết lập cho tôi - ~ / .m2 / repository. Tôi có phải chỉ định nó ngay cả khi nó là mặc định không?
Dave

Đối với tôi, có các tệp khác trong kho lưu trữ cục bộ của tôi, chẳng hạn như * .sha1 hoặc * .lastUpdate. xóa các tệp khác ngoại trừ * .jar và * .pom sẽ ngăn maven tải lại tệp từ kho lưu trữ từ xa
Harun

Câu trả lời:


45

Phụ thuộc có một phiên bản ảnh chụp nhanh. Đối với ảnh chụp nhanh, Maven sẽ kiểm tra kho lưu trữ cục bộ và nếu phần mềm được tìm thấy trong kho lưu trữ cục bộ quá cũ, nó sẽ cố gắng tìm một cái đã cập nhật trong kho lưu trữ từ xa. Đó có lẽ là những gì bạn đang thấy.

Lưu ý rằng hành vi này được kiểm soát bởi updatePolicychỉ thị trong cấu hình kho lưu trữ ( dailytheo mặc định cho các kho lưu trữ ảnh chụp nhanh).


16
Có thể "ghi đè" điều này bằng đối số lệnh console không? Như: mvn clean install -FORCE_COMMAND
Naxos84

21
"Quá cũ" nghĩa là gì? Nó chọn ảnh chụp nhanh mới nhất mà nó có thể tìm thấy, cho dù đó là ảnh cục bộ hay từ xa? Đó chắc chắn sẽ là hành vi khủng khiếp. Nếu tôi vừa tạo một ảnh chụp nhanh, tôi thực sự muốn sử dụng ảnh đó, không phải ảnh mà bản dựng CI đã tạo chỉ một lúc sau.
Tom Quarendon

Vui lòng giải thích thêm về "Quá cũ" nghĩa là gì?
Đỗ Công Bằng

32

Sử dụng mvn --help và bạn có thể thấy danh sách tùy chọn.

Có một tùy chọn như -nsu,--no-snapshot-updates Suppress SNAPSHOT updates

Vì vậy, sử dụng lệnh mvn install -nsucó thể buộc biên dịch với kho lưu trữ cục bộ.


10
Bạn cũng có thể sử dụng -ocho hành vi của maven "ngoại tuyến"
Sean

8
Tùy chọn -nsu không ngăn mvn thử và không thể tải xuống phần mềm từ xa nếu nó chưa được tải xuống thay vì sử dụng bản dựng cục bộ như khi phần mềm được tạo và cài đặt cục bộ. -
dùng1767316

Tôi gặp sự cố tương tự với một cấu phần phần mềm chưa được tải xuống và cách này đã khắc phục sự cố cho tôi: maven.apache.org/general.html#importing-jars
Luigi Cristalli

15

Thực sự buộc maven chỉ sử dụng repo cục bộ của bạn, bạn có thể chạy với mvn <goals> -o. Các -obảo maven để cho bạn làm việc "ẩn", và nó sẽ ở lại ra khỏi mạng.


5
Tùy chọn -o không ngăn mvn cố gắng và không thể tải xuống phần mềm từ xa nếu nó chưa được tải xuống thay vì sử dụng bản dựng cục bộ như khi phần mềm được tạo và cài đặt cục bộ.
user1767316

2
điều đó đúng - nếu bạn không có bản sao cục bộ, bạn đã gặp may. Điều này hữu ích cho các dự án bạn đã xây dựng trước đây, nhưng có khả năng có những thay đổi SNAPSHOT gần đây mà bạn không quan tâm.
Sean

Hoặc ngay cả khi bạn không bao giờ xây dựng dự án bạn có thể chuẩn bị cho nó được xây dựng ẩn vớimvn dependency:go-offline
Aldian

Điều gì sẽ xảy ra nếu bạn có một bản sao cục bộ mà bạn vừa cài đặt (vì vậy nó không bao giờ được triển khai / có sẵn trong repo ảnh chụp nhanh từ xa)?
Vivek Chavda

1
À, tôi vừa tạo một dự án pom với một tập hợp các phụ thuộc, nhưng không chỉ định <type> pom </type> trong dự án tiêu thụ, vì vậy nó đang tìm kiếm một jar (và tất nhiên là không thể tìm thấy nó, ngay cả ở chế độ ngoại tuyến)
Vivek Chavda

4

Trong trường hợp của tôi, tôi đã có một dự án nhiều mô-đun giống như bạn. Tôi đã phải thay đổi Id nhóm của một trong các thư viện bên ngoài mà dự án của tôi phụ thuộc vào như hình dưới đây.

Từ:

<dependencyManagement>
    <dependency>
        <groupId>org.thirdparty</groupId>
        <artifactId>calculation-api</artifactId>
        <version>2.0</version>
        <type>jar</type>
        <scope>provided</scope>
    </dependency>
<dependencyManagement>

Đến:

<dependencyManagement>
   <dependency>
      <groupId>org.thirdparty.module</groupId>
        <artifactId>calculation-api</artifactId>
        <version>2.0</version>
        <type>jar</type>
        <scope>provided</scope>
    </dependency>
<dependencyManagement>

Chú ý đến phần <groupId>. Hóa ra là tôi đã quên sửa đổi phần tương ứng của các mô-đun con xác định sự phụ thuộc này trong các tệp pom của chúng.

Nó khiến tôi rất phát điên vì mô-đun có sẵn tại địa phương.


4

Làm theo các bước sau:

    1. Đảm bảo xóa tất cả nội dung của thư mục jar nằm trong cục bộ của bạn ngoại trừ jar mà bạn muốn giữ lại.
      Ví dụ, các tệp như .repositories, .pom, .sha1, .lastUpdated, v.v.
    1. Thực thi mvn clean install -olệnh

Điều này sẽ giúp sử dụng các tệp jar của kho lưu trữ cục bộ hơn là kết nối với bất kỳ kho lưu trữ nào.


1
Chỉ xóa *.repositories*.sha1các tệp đã hoạt động với tôi
DLight

2

Tùy chọn -o không hoạt động với tôi vì phần mềm vẫn đang được phát triển và chưa được tải lên và maven (3.5.x) vẫn cố tải xuống từ kho lưu trữ từ xa vì đây là lần đầu tiên, theo lỗi tôi nhận được.

Tuy nhiên, điều này đã khắc phục sự cố cho tôi: https://maven.apache.org/general.html#importing-jars

Sau khi cài đặt thủ công này, bạn cũng không cần phải sử dụng tùy chọn ngoại tuyến.

CẬP NHẬT

Tôi vừa xây dựng lại phần phụ thuộc và tôi phải nhập lại nó: cái chính quy mvn clean installkhông đủ cho tôi


-1

Maven luôn kiểm tra kho lưu trữ cục bộ của bạn trước tiên, tuy nhiên, phần phụ thuộc của bạn cần được cài đặt trong kho của bạn để maven tìm thấy nó.

Chạy mvn installtrong mô-đun phụ thuộc của bạn trước, sau đó xây dựng mô-đun phụ thuộc của bạn.


1
Tôi đã chỉnh sửa câu hỏi của mình để hiển thị rằng hiện vật đang ở trong repo (lưu ý lệnh "ls -al" mà tôi chạy. Tuy nhiên, Maven vẫn đang cố tải xuống. Bạn có ý kiến ​​nào khác không?
Dave

5
@Oliver: bạn đang thiếu thực tế là đối với các phần mềm trong kho lưu trữ cục bộ, Maven vẫn có thể tham khảo các kho lưu trữ từ xa nếu phần mềm là một ảnh chụp nhanh quá cũ.
Andreas Veithen
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.