Tải xuống tất cả các phụ thuộc maven vào một thư mục KHÔNG trong kho lưu trữ?


127

Tôi bắt đầu chuyển đổi dự án của mình thành maven vì tôi cần sử dụng một thư viện được phân phối ở dạng nhị phân chỉ trên maven, nhưng sau khi đập đầu vào tường quá lâu, tôi đã quyết định ngừng làm tổn thương bản thân và chỉ sử dụng Con kiến. Tôi muốn chỉ cần maven tải jar và tất cả các phụ thuộc bắc cầu của nó vào một thư mục mà tôi chọn để tôi có thể kiểm tra chúng vào SCM của mình khi tôi thường thích và trở thành nhà phát triển hạnh phúc một lần nữa.
Bất kỳ ý tưởng làm thế nào để làm điều đó một cách dễ dàng?


2
Cân nhắc sử dụng Ivy và nhận quản lý phụ thuộc bắc cầu mà bạn cần, với Ant mà bạn tin tưởng. Hoặc cắn viên đạn và sử dụng cấu trúc thư mục Maven.
Dave Newton

Bạn đã thử Ivy chưa?
Tomasz Nurkiewicz

5
Không, nhưng tôi đã dành tất cả sự kiên nhẫn của mình với việc chuyển đổi vào thời điểm này. Có lẽ lần sau. Tôi muốn quay lại mã hóa. Nó có thể được thực hiện với maven?
chubbsondub

Câu trả lời:


260

Các Plugin phụ thuộc maven khả năng có thể giải quyết vấn đề của bạn.

Nếu bạn có một pomvới tất cả các phụ thuộc dự án của bạn được chỉ định, tất cả những gì bạn cần làm là chạy

mvn dependency:copy-dependencies

và bạn sẽ tìm thấy target/dependenciesthư mục chứa đầy tất cả các phụ thuộc, bao gồm cả chuyển tiếp.

Thêm câu trả lời của Gustavo từ bên dưới : Để tải xuống các nguồn phụ thuộc , bạn có thể sử dụng

mvn dependency:copy-dependencies -Dclassifier=sources

(thông qua tài liệu Plugin phụ thuộc Apache Maven ).


1
Thx @Raghuram, tôi đã tìm kiếm điều này từ lâu.
eskalera

Nhưng nếu tôi muốn sao chép tất cả các phụ thuộc vào repo địa phương thì sao? Đây là nó được sử dụng cho? Tại sao phải sao chép nếu nó có thể đã có trong repo địa phương. Dù sao nó cũng là địa phương.

1
@ ống Một bản dựng maven tiêu chuẩn (ví dụ: biên dịch, kiểm tra, gói, cài đặt, v.v.; không chắc chắn về xác thực) đã sao chép tất cả các phụ thuộc vào repo cục bộ của bạn theo mặc định. Đây không phải là cho điều đó. Thay vào đó là cho các tình huống mà bạn cần phụ thuộc vào ứng dụng của mình vì bất kỳ lý do gì. Tôi đang sử dụng nó ngay bây giờ để kiểm tra các thư viện phụ thuộc để tìm định nghĩa API dư thừa (ví dụ: một số thư viện sẽ bao gồm API Javax, có thể xung đột với các phiên bản khác của cùng API), nhưng cũng tốt nếu ứng dụng của bạn cần gói phụ thuộc với nó. để phân phối, hoặc bất cứ điều gì.
Climby Quigman

1
+1 cho câu trả lời rõ ràng, súc tích và hữu ích. Tôi vừa trải qua điệu nhảy Maven giống như OP và chỉ muốn lấy lại các phụ thuộc tệp JAR. Cảm ơn! Tôi ước tôi có thể +10
Brandon

@Raghuram Về mặt kỹ thuật, bạn kết thúc với tất cả các tạo tác (đã giải quyết) trong "mục tiêu / phụ thuộc". Hơn nữa, có một vấn đề tiềm ẩn của xung đột tên khi tọa độ "groupId" của một phụ thuộc bị bỏ qua. Nói cách khác, "phụ thuộc: phụ thuộc sao chép" không bảo toàn cấu trúc bố cục.
whaefelinger

8

Dựa trên câu trả lời @Raghuram , tôi tìm thấy một hướng dẫn về Sao chép phụ thuộc dự án , Chỉ cần:

  1. Mở pom.xmltệp dự án của bạn và tìm thấy điều này:

    <project>
      [...]
      <build>
        <plugins>
          ...
        </plugins>
      </build>
      [...]
    </project>
    
  2. Thay thế <plugins> ... </plugins>bằng:

    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <outputDirectory>${project.build.directory}/alternateLocation</outputDirectory>
              <overWriteReleases>false</overWriteReleases>
              <overWriteSnapshots>false</overWriteSnapshots>
              <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
    
  3. Và gọi maven trong dòng lệnh mvn dependency:copy-dependencies

Sau khi hoàn thành, nó sẽ tạo thư mục target/dependencytrong tất cả các jarphụ thuộc của thư mục hiện tại nơi pom.xmlsinh sống.


Tôi gõ lệnh "mvn" ở đâu? Nhấp chuột phải vào maven-project-> Maven -> .. ??
Nướng bánh nướng

Trong một dòng lệnh đầu cuối trên thư mục chứa pom.xmltập tin.
người dùng

1
Không hoạt động. Tôi nghĩ Maven chỉ được cài đặt như một plugin. Tôi cũng phải tải xuống Maven bằng tay. Sau đó mvn dependency:copy-dependencieslàm việc!
Nướng bánh nướng

8

Cuối cùng tôi đã tìm ra cách sử dụng Maven. Từ trong Eclipse, tạo một dự án Maven mới.

Tải xuống Maven, giải nén tệp lưu trữ, thêm /binthư mục vào đường dẫn.

Xác thực cài đặt từ dòng lệnh bằng cách chạy mvn -v(sẽ in phiên bản và đường dẫn cài đặt java)

Thay đổi thư mục gốc của dự án ( pom.xmlvị trí được đặt) và chạy:

mvn dependency:copy-dependencies

Tất cả các tệp jar được tải xuống /target/dependency.

Để đặt thư mục đầu ra khác:

mvn dependency:copy-dependencies -DoutputDirectory="c:\temp"

Bây giờ có thể sử dụng lại dự án Maven này cho tất cả các tải xuống phụ thuộc bằng cách thay đổi pom.xml

Thêm jars vào dự án java bằng cách xây dựng đường dẫn -> cấu hình đường dẫn xây dựng -> thư viện -> thêm JARs ..


1
Không nhất thiết phải là một dự án nhật thực. Tôi đã mở một tệp jar trong Java Decompiler và sao chép pom.xml vào một thư mục trống. Tôi đã gọi mvn dependency:copy-dependenciesnhư bạn mô tả từ thư mục đó và nhận được tất cả các tệp jar phụ thuộc được sao chép độc đáo vào một thư mục duy nhất.
Bernhard Döbler


2

Vui lòng kiểm tra nếu bạn có một số tập tin cấu hình trong ${MAVEN_HOME}/confthư mục như thế nào settings.xml. Các tệp đó ghi đè cài đặt từ .m2thư mục và do đó, thư mục kho lưu trữ .m2có thể không hiển thị hoặc bị loại bỏ.

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.