Làm cách nào tôi có thể tải xuống một tạo phẩm Maven cụ thể trong một dòng lệnh?


168

Tôi có thể cài đặt một vật phẩm bằng cách install:install-file, nhưng làm cách nào tôi có thể tải xuống một vật phẩm?

Ví dụ:

mvn download:download-file -DgroupId=.. -DartifactId=.. -Dversion=LATEST

11
Coi chừng plugin muốn 'repoUrl', mặc dù tài liệu có nội dung 'repositoryUrl'. Nó có thể khiến bạn phát điên như đã làm với tôi!
zakmck

các tài liệu ( maven.apache.org/plugins/maven-dependency-plugin/get-mojo.html ) hiển thị cả hai thông số xml (<repositoryUrl> ... </ repositoryUrl>) và thuộc tính người dùng dòng lệnh (mvn .. . -DrepoUrl = "..."). Ví dụ cụ thể này không được dùng nữa, vì vậy không phải lo lắng; bây giờ nó là các kho lưu trữ từ xa thống nhất (trong cả hai cách sử dụng); nhưng lưu ý rằng tham số "đích" là thuộc tính người dùng "-Ddest = ..."; ví dụ => mvn org.apache.maven.plugins: maven-Depency-plugin: 2.5.1: get -DremoteRepositories = repo.maven.apache.org -Dartifact = org.apache.ant: ant: 1.8.1 -Ddest = ant-1.8.1.jar (kết quả: ant-1.8.1.jar trong thư mục hiện tại)
michael

Câu trả lời:


182

Bạn có thể sử dụng plugin phụ thuộc mavendependency:getmục tiêu hay kể từ phiên bản 2.1. Không cần pom, mọi thứ xảy ra trên dòng lệnh.

Để đảm bảo tìm dependency:getmục tiêu, bạn cần thông báo rõ ràng cho maven sử dụng phiên bản 2.1, tức là bạn cần sử dụng tên đầy đủ của plugin, bao gồm cả phiên bản:

mvn org.apache.maven.plugins:maven-dependency-plugin:2.1:get \
    -DrepoUrl=url \
    -Dartifact=groupId:artifactId:version

CẬP NHẬT: Với các phiên bản cũ hơn của Maven (trước 2.1), có thể chạy dependency:getbình thường (không cần sử dụng tên và phiên bản đủ điều kiện) bằng cách buộc bản sao maven của bạn sử dụng một phiên bản plugin đã cho.

Điều này có thể được thực hiện như sau:

1. Thêm dòng sau trong <settings>phần tử của ~/.m2/settings.xmltệp của bạn :

<usePluginRegistry>true</usePluginRegistry>

2. Thêm tệp ~/.m2/plugin-registry.xmlvới nội dung sau:

<?xml version="1.0" encoding="UTF-8"?>
<pluginRegistry xsi:schemaLocation="http://maven.apache.org/PLUGIN_REGISTRY/1.0.0 http://maven.apache.org/xsd/plugin-registry-1.0.0.xsd"
xmlns="http://maven.apache.org/PLUGIN_REGISTRY/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <useVersion>2.1</useVersion>
      <rejectedVersions/>
    </plugin>
  </plugins>
</pluginRegistry>

Nhưng điều này dường như không còn hoạt động nữa với maven 2.1 / 2.2. Trên thực tế, theo Giới thiệu về Đăng ký Plugin , các tính năng của plugin-registry.xmlđã được thiết kế lại (cho tính di động) và đăng ký plugin hiện đang ở trạng thái không hoạt động trong Maven 2 . Vì vậy, tôi nghĩ rằng bây giờ chúng ta phải sử dụng tên dài (khi sử dụng plugin không có pom, đó là ý tưởng đằng sau dependency:get).


1
Có, và tôi vừa có cùng một độ phân giải bằng cách sử dụng phụ thuộc: lấy mục tiêu. mvn phụ thuộc: get -Dartifact = org.apache.archiva: archiva-webapp: LATEST: war -DrepoUrl = repository.sonatype.org/content/reposeocate/central Điều bất tiện duy nhất là tôi phải cung cấp tùy chọn repoUrl. Thông tin của bạn thực sự hữu ích, tôi đang sử dụng mvn 2.2.1 (rdebian-1) và tôi đã không chạm vào pluginRegistry. Cảm ơn.
Xiè Jìléi

2
mục tiêu "get" này dường như "chỉ hoạt động" một lần nữa (không yêu cầu cấu hình / hack bổ sung; plugin 2.5.1, mvn 3.0.4): = example => mvn org.apache.maven.plugins: maven-Depency-plugin: 2.5.1: get -DremoteRepositories = repo.maven.apache.org -Dartifact = org.apache.ant: ant: 1.8.1 -Ddest = ant-1.8.1.jar
michael

Sự khác biệt giữa get và install là gì? Cả hai không lấy về repo maven địa phương của bạn? --edit: đợi đã, không, tôi hiểu rồi; cài đặt là để các deps cục bộ của bạn được sao chép vào repo m2 cục bộ, lấy chúng từ xa.
Chris2048

4
đã tìm thấy nó, chỉ cần thêm :jar:sourcesvào vật phẩm , xem stackoverflow.com/a/31109185/537554
ryenus

1
Với các phiên bản mới hơn của Maven (ví dụ 3.6.0), bạn vẫn có thể làm điều đó chỉ vớimvn dependency:get -Dartifact=group-id:artefact-id:version
Scrutari

93

Với phiên bản mới nhất (2.8) của Plugin phụ thuộc Maven , việc tải xuống một vật phẩm từ Kho lưu trữ trung tâm Maven đơn giản như:

mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:get -Dartifact=groupId:artifactId:version[:packaging[:classifier]]

trong đó groupId:artifactId:version, vv là tọa độ Maven

Một ví dụ, được thử nghiệm với Maven 2.0.9, Maven 2.2.1 và Maven 3.0.4:

mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:get -Dartifact=org.hibernate:hibernate-entitymanager:3.4.0.GA:jar:sources

(Cảm ơn Pascal Thivent đã cung cấp câu trả lời tuyệt vời của anh ấy ngay từ đầu. Tôi đang thêm một câu trả lời khác, vì nó không phù hợp với một nhận xét và nó sẽ quá rộng để chỉnh sửa.)


Tôi đã sử dụng điều này để tải về maven archetype. Điều này hoạt động rất tốt nếu bạn đứng sau proxy và làm việc với nhật thực mà không đăng ký để xác định các kiểu lưu trữ maven mặc dù bạn đã định cấu hình proxy trong cài đặt xml.
Acewin

mvn org.apache.maven.plugins: maven-Depency-plugin: 2.8: get -Dartifact = org.apache.maven.archetypes: maven-archetype-webapp: 1.0: jar
Acewin

Bạn có thể giải thích những gì jar:sourcescó nghĩa / không? Tại sao bạn cần chỉ định "jar"? và "nguồn" có nghĩa là nó sẽ tải xuống các phụ thuộc bổ sung mà tạo phẩm yêu cầu không?
red888

"jar" là loại bao bì, "nguồn" là phân loại. Với một phụ thuộc (ví dụ, hibernate-core ), có thể có nhiều hơn một tạo tác. Thông thường, có: 1. thư viện chỉ nhị phân, 2. sources, tệp JAR chỉ chứa các nguồn Java, 3. javadoc, tệp JAR chỉ có tài liệu API. Xem thêm: Trình xử lý tạo tác mặc định của Maven .
Danilo Piazzalunga

Cảm ơn về việc làm rõ cách sử dụng [:classifier]chính xác, nếu tôi có một plugin tập hợp được tạo tệp zip mà tôi muốn tải xuống.
jonashackt

43

Đây là thứ giúp tôi tải xuống phiên bản mới nhất của một vật phẩm có tên là "component.jar" với Maven 3.1.1 (cuối cùng các đề xuất khác không có, chủ yếu là do thay đổi phiên bản maven tôi tin)

Điều này thực sự tải tập tin và sao chép nó vào thư mục làm việc cục bộ

Từ bash:

mvn dependency:get \
    -DrepoUrl=http://.../ \
        -Dartifact=com.foo.something:component:LATEST:jar \
        -Dtransitive=false \
        -Ddest=component.jar \

Cảm ơn rất nhiều! Tôi không cần sự kiện -DrepoUrl, tôi đoán nó được ngụ ý từ pom của tôi. Ngoài ra tôi đã không sử dụng -Ddestnhư tôi thực sự đã muốn để nó tải đến thường xuyên .m2thư mục.
ngày

15
Các desttham số bị phản đối , và có thể được thay thế bằng một invokation của copysau getnhư vậy: mvn dependency:copy -Dartifact=com.foo.something:component:LATEST:jar -DoutputDirectory=.(trong trường hợp này đặt jar trong thư mục làm việc).
Jacob Raihle

@JacobRaihle Sau đó, tôi không thể tải xuống tệp mà không có pom.xml, gặp lỗi sau : Goal requires a project to execute but there is no POM in this directory.
Athlan

2
@Athlan Hỗ trợ No-pom có ​​thể là một tính năng mới hơn, tôi cho rằng. Ngày nay tôi chỉ có thể chạy mvn dependency:copy(không có dependency:getđầu tiên).
Jacob Raihle

26

Về cách lấy nhị phân nhân tạo, câu trả lời của Pascal Thivent là như vậy, nhưng để có được các lọ nguồn tạo tác, chúng ta có thể sử dụng:

mvn dependency:get -Dartifact=groupId:artifactId:version:jar:sources

ví dụ

mvn dependency:get -Dartifact=junit:junit:4.12:jar:sources

Điều này hoạt động bởi vì artifacttham số thực sự bao gồm groupId:artifactId:version[:packaging][:classifier]. Chỉ cần đóng góiphân loại là tùy chọn.

Với jarnhư đóng góisourcesnhư phân loại , các plugin phụ thuộc maven hiểu chúng tôi đang yêu cầu cho jar nguồn khác nhau, không phải là jar artifact.

Thật không may cho bây giờ các nguồn jar tệp không thể được tải xuống quá mức, điều này có ý nghĩa, nhưng lý tưởng là tôi tin rằng nó cũng có thể tôn trọng tùy chọn downloadSourcesgiống như plugin nhật thực maven.


17

Người ta có thể sử dụng phụ thuộc: copy ( http://maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html ) trong đó lấy danh sách các tạo phẩm được xác định trong phần cấu hình plugin và sao chép chúng vào một vị trí được chỉ định , đổi tên chúng hoặc tước phiên bản nếu muốn. Mục tiêu này có thể giải quyết các tạo phẩm từ kho lưu trữ từ xa nếu chúng không tồn tại trong kho lưu trữ cục bộ hoặc lò phản ứng.

Không phải tất cả các thuộc tính của plugin có thể được sử dụng trong maven CLI. Các thuộc tính có thuộc tính "Người dùng:" được xác định có thể được chỉ định. Trong ví dụ dưới đây, tôi đang tải Junit vào thư mục tạm thời của mình và tước vesion từ tệp jar.

mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:copy -Dartifact=junit:junit:4.11 -DoutputDirectory=/tmp -Dmdep.stripVersion=true

trong đó artifact = junit: junit: 4.11 là tọa độ maven. Và bạn chỉ định artifcat là groupId: artifactId: version [: bao bì [: classifier]]

(Cảm ơn Pascal Thivent đã cung cấp https://stackoverflow.com/a/18632876/2509415 của anh ấy ở nơi đầu tiên. Tôi đang thêm một câu trả lời khác)


11

một lớp để tải về tạo tác maven mới nhất mà không có mvn:

curl -O -J -L  "https://repository.sonatype.org/service/local/artifact/maven/content?r=central-proxy&g=io.staticcdn.sdk&a=staticcdn-sdk-standalone-optimizer&e=zip&v=LATEST"

3
Bị hạ bệ. Giải pháp này dường như chỉ hoạt động với một sản phẩm lưu trữ cụ thể.
Martín Straus

1
Hoạt động tuyệt vời với Nexus 2.x, không hoạt động với 3.x (chưa)
HDave

curl: tùy chọn -J là ẩn số
xuehui

2

Việc sử dụng từ các tài liệu chính thức:

https://maven.apache.org/plugins/maven-dependency-plugin/usage.html#dependency:get

Đối với trường hợp của tôi, xem câu trả lời dưới đây:

mvn dependency:get -Dartifact=$2:$3:$4:$5 -DremoteRepositories=$1 -Dtransitive=false
mvn dependency:copy -Dartifact=$2:$3:$4:$5 -DremoteRepositories=$1 -Dtransitive=false -DoutputDirectory=$6

#mvn dependency:get -Dartifact=com.huya.mtp:hynswup:1.0.88-SNAPSHOT:jar -DremoteRepositories=http://nexus.google.com:8081/repository/maven-snapshots/ -Dtransitive=false
#mvn dependency:copy -Dartifact=com.huya.mtp:hynswup:1.0.88-SNAPSHOT:jar -DremoteRepositories=http://nexus.google.com:8081/repository/maven-snapshots/ -Dtransitive=false -DoutputDirectory=.

Sử dụng lệnh "mvn phụ thuộc: get" để tải xuống aritfact cụ thể và sử dụng lệnh "mvn phụ thuộc: sao chép" để sao chép tạo phẩm đã tải xuống để hủy dir "-DoutputDirectory"


1

Đây là một ví dụ để lấy ASM-7 bằng Maven 3.6:

mvn dependency:get -DremoteRepositories=maven.apache.org -Dartifact=org.ow2.asm:7.0:sources:jar

Hoặc bạn có thể tải xuống jar từ đây: https://search.maven.org/search?q=g:org.ow2.asm%20AND%20a:asm và sau đó

mvn install:install-file -DgroupId=org.ow2.asm -DartifactId=asm -Dversion=7.0 -Dclassifier=sources -Dpackaging=jar -Dfile=/path/to/asm-7.0.jar

0

Lệnh:

mvn install:install-file 

Thông thường cài đặt các tạo phẩm trong kho lưu trữ cục bộ của bạn, vì vậy bạn không cần phải tải xuống. Tuy nhiên, nếu bạn muốn chia sẻ cổ vật của mình với người khác, bạn sẽ cần triển khai tạo phẩm vào kho lưu trữ trung tâm, xem plugin triển khai để biết thêm chi tiết.

Ngoài ra, việc thêm phụ thuộc vào POM của bạn sẽ tự động tìm nạp bất kỳ tạo phẩm của bên thứ ba nào bạn cần khi bạn xây dựng dự án của mình. Tức là Điều này sẽ tải xuống các tạo phẩm từ kho lưu trữ trung tâm.


0

LATEST không được dùng nữa, hãy thử với phạm vi [,)

./mvnw org.apache.maven.plugins:maven-dependency-plugin:3.1.1:get \  
-DremoteRepositories=repoId::default::https://nexus/repository/maven-releases/ \
"-Dartifact=com.acme:foo:[,)"
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.