Як я можу завантажити певний артефакт Maven в одному командному рядку?


168

Я можу встановити артефакт install:install-file, але як я можу завантажити артефакт?

Наприклад:

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

11
Слідкуйте за тим, що плагін хоче "repoUrl", незважаючи на документацію, що говорить "repositoryUrl". Це може звести з розуму, як це зробило мені!
zakmck

у документах ( maven.apache.org/plugins/maven-dependency-plugin/get-mojo.html ) відображаються параметри xml (<repositoryUrl> ... </repositoryUrl>) та користувальницькі властивості командного рядка (mvn .. . -DrepoUrl = "..."). Цей конкретний приклад застарілий, тому не хвилюйтеся; тепер це рівномірно віддалені репозиторії (в обох випадках); але зауважте, що параметр "призначення" є властивістю користувача "-Ddest = ..."; напр. => mvn org.apache.maven.plugins: maven-залежність-плагін: 2.5.1: get -DremoteRepositories = repo.maven.apache.org -Dartifact = org.apache.ant: ant: 1.8.1 -Ddest = ant-1.8.1.jar (результат: ant-1.8.1.jar у поточному каталозі)
michael

Відповіді:


182

Ви можете використовувати плагін залежності maven, який має гарну dependency:getмету з версії 2.1. Не потрібно пам’яті, все відбувається в командному рядку.

Щоб переконатися у пошуку dependency:getмети, вам потрібно чітко сказати maven використовувати версію 2.1, тобто вам потрібно використовувати повністю кваліфіковане ім'я плагіна, включаючи версію:

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

ОНОВЛЕННЯ: У старих версіях Maven (до 2.1) можна запуститись dependency:getнормально (без використання повністю кваліфікованого імені та версії), змусивши вашу копію Maven використовувати задану версію плагіна.

Це можна зробити так:

1. Додайте наступний рядок до <settings>елемента вашого ~/.m2/settings.xmlфайлу:

<usePluginRegistry>true</usePluginRegistry>

2. Додайте файл ~/.m2/plugin-registry.xmlіз таким вмістом:

<?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>

Але, схоже, це більше не працює з Maven 2.1 / 2.2. Насправді, згідно з Введенням до реєстру плагінів , особливості plugin-registry.xmlперероблені (для переносимості), а реєстр плагінів зараз знаходиться у напівзапильному стані в Maven 2 . Тому я думаю, що ми повинні використовувати довге ім'я зараз (коли використовуємо плагін без пом, що ідея dependency:get).


1
Так, і я щойно отримав ту саму роздільну здатність, використовуючи залежність: досягти мети. mvn залежність: get -Dartifact = org.apache.archiva: archiva-webapp: ОСТАНО: війна -DrepoUrl = repository.sonatype.org/content/repositories/central Єдина незручність полягає в тому, що я повинен надати опцію repoUrl. Ваша інформація справді допомагає, я використовую mvn 2.2.1 (rdebian-1), і плагінRegistry я не торкнувся. Дякую.
Xiè Jìléi

2
ця мета "отримати", схоже, знову "просто працює" (не потрібні додаткові конфігурації / злому; плагін 2.5.1, mvn 3.0.4): = example => mvn org.apache.maven.plugins: maven-залежність-плагін: 2.5.1: get -DremoteRepositories = repo.maven.apache.org -Dartifact = org.apache.ant: ant: 1.8.1 -Ddest = ant-1.8.1.jar
michael

Яка різниця між отримати та встановити? Хіба вони не приїжджають до місцевого ревізора Maven? --edit: зачекай, ні, зараз я дістаю; Установка - це для того, щоб ваші локальні версії копіювались на локальний репортаж m2, отримуйте їх із віддаленого пристрою.
Chris2048

4
знайшов це, просто додайте :jar:sourcesдо артефакту , см stackoverflow.com/a/31109185/537554
ryenus

1
З новішими версіями Maven (наприклад, 3.6.0) ви все одно можете це робити простоmvn dependency:get -Dartifact=group-id:artefact-id:version
scrutari

93

З останньою версією (2.8) плагіна Maven Dependency завантаження артефакту з центрального сховища Maven просте, як:

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

де groupId:artifactId:versionі т.д. - координати Мейвена

Приклад, протестований з Maven 2.0.9, Maven 2.2.1 та 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

(Дякую Паскалю Тівенту за те, що він надав чудову відповідь, в першу чергу. Додаю ще одну відповідь, тому що вона не впишеться в коментар, і вона буде надто обширною для редагування.)


Я використовував це для завантаження архетипу Maven. Це чудово спрацьовує, якщо ви стоїте за проксі-сервером і працюєте з затемненням, яке не вдається зареєструвати ідентифікаційні архіви Maven, навіть якщо ви налаштували проксі в налаштуваннях xml.
Acewin

mvn org.apache.maven.plugins: maven-залежність-плагін: 2.8: get -Dartifact = org.apache.maven.archetypes: maven-archetype-
webapp

Чи можете ви пояснити, що jar:sourcesозначає / робить? навіщо потрібно вказувати "банку"? і чи означають "джерела", що вони завантажуватимуть додаткові залежності, необхідні артефакту?
red888

"jar" - тип упаковки, "джерела" - класифікатор. Враховуючи одну залежність (наприклад, сплячу ядро ), може бути більше одного артефакту. Часто зустрічаються: 1. бібліотека, призначена лише для бінарних файлів, 2. sources, файл JAR, що містить лише джерела Java, 3. javadoc, файл JAR лише з документами API. Дивіться також: Maven Завантажувачі артефактів за замовчуванням .
Данило П'яццалунга

Дякую, як [:classifier]пояснити, як правильно користуватися, якщо у мене створений zip-файл, створений плагіном assemlby, який я хочу завантажити.
jonashackt

43

Ось що для мене працювало, щоб завантажити останню версію артефакту під назвою "компонент.jar" з Maven 3.1.1 врешті-решт (інших пропозицій не було, в основному через зміни версії Maven, я вважаю)

Це фактично завантажує файл і копіює його в локальну робочу директорію

Від баш:

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

Щиро дякую! Мені не потрібна подія -DrepoUrl, я гадаю, це все-таки було зрозуміло з моєї пом. Крім того, я не використовував , -Ddestяк я на самом деле зробив бажання його завантаження в регулярному .m2каталозі.
yair

15
destПараметр є застарілим , і може бути замінений на invokation з copyпісля того, getяк так: mvn dependency:copy -Dartifact=com.foo.something:component:LATEST:jar -DoutputDirectory=.(в даному випадку розміщення банки в робочому каталозі).
Яків Райхле

@JacobRaihle Тоді я не можу завантажити файл без pom.xml, отримую наступне повідомлення про помилку: Goal requires a project to execute but there is no POM in this directory.
Атлан

2
Я думаю, що підтримка No-pom може бути більш новою функцією. Сьогодні я можу просто бігати mvn dependency:copy(без dependency:getпершого).
Яків Райхле

26

Щодо того, як отримати бінарний артефакт, відповідь Паскаля Тівента - це, але щоб також отримати банку з джерелами артефакту, ми можемо використовувати:

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

напр

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

Це працює, тому що artifactпараметр насправді складається з groupId:artifactId:version[:packaging][:classifier]. Просто упаковка та класифікатор не є обов'язковими.

З jarв упаковці і sourcesв класифікаторі , плагін Maven залежностей розуміє , ми просимо банку джерел, а НЕ артефакт баночки.

На жаль, наразі джерельні файли jar не можна завантажувати транзитивно, що має сенс, але в ідеалі я вважаю, що він також може поважати цей варіант, downloadSourcesяк і плагін Maven eclipse.


17

Можна використовувати залежність: копію ( http://maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html ), яка бере список артефактів, визначених у розділі конфігурації плагіна, та копіює їх у вказане місце , перейменувавши їх або знявши версію за бажанням. Ця мета може вирішити артефакти з віддалених сховищ, якщо вони не існують ні в локальному сховищі, ні в реакторі.

Не всі властивості плагіна можуть використовуватися у Maven CLI. Можуть бути вказані властивості, у яких визначено властивість "Властивість користувача:". У наведеному нижче прикладі я завантажую junit у свою темп-папку і знімаю візію з файлу jar.

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

де артефакт = junit: junit: 4.11 - координати Maven. І ви вказуєте articat як groupId: artifactId: version [: Packaging [: Classifier]]

(Спасибі Паскалю Тівенту за те, що він надав свій https://stackoverflow.com/a/18632876/2509415 . Я додаю ще одну відповідь)


11

один лайнер для завантаження найновішого артефакту Maven без 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
Захищений. Це рішення, здається, працює лише з конкретним продуктом сховища.
Мартін Строс


curl: варіант -J невідомо
xuehui

2

Використання з офіційної документації:

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

У моєму випадку дивіться відповідь нижче:

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=.

Використовуйте команду "mvn залежність: get" для завантаження конкретного артефакту та використовуйте команду "mvn залежність: copy" для копіювання завантаженого артефакту у dest dir "-DoutputDirectory"


1

Ось приклад отримання ASM-7 за допомогою Maven 3.6:

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

Або ви можете завантажити банку звідси: https://search.maven.org/search?q=g:org.ow2.asm%20AND%20a:asm, а потім

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

Команда:

mvn install:install-file 

Зазвичай артефакт встановлюється у вашому локальному сховищі, тому завантажувати його не потрібно. Однак, якщо ви хочете поділитися своїм артефактом з іншими, вам потрібно буде розгорнути артефакт у центральному сховищі, для отримання детальної інформації див плагін розгортання .

Крім того, додавання залежності до вашого POM автоматично отримає сторонні артефакти, необхідні під час створення проекту. Тобто Це завантажить артефакт із центрального сховища.


0

LATEST застаріло, спробуйте з діапазоном [,)

./mvnw org.apache.maven.plugins:maven-dependency-plugin:3.1.1:get \  
-DremoteRepositories=repoId::default::https://nexus/repository/maven-releases/ \
"-Dartifact=com.acme:foo:[,)"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.