Как я могу загрузить определенный артефакт Maven в одной командной строке?

168

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

Например:

mvn download:download-file -DgroupId=.. -DartifactId=.. -Dversion=LATEST
Xiè Jìléi
источник
11
Помните, что плагин хочет «repoUrl», несмотря на документацию «repositoryUrl». Это может свести тебя с ума, как и меня!
zakmck
в документах ( maven.apache.org/plugins/maven-dependency-plugin/get-mojo.html ) показаны как xml-параметры (<repositoryUrl> ... </ repositoryUrl>), так и пользовательские свойства командной строки (mvn .. . -DrepoUrl = "..."). Этот конкретный пример устарел, так что не стоит беспокоиться; теперь это теперь равномерно удаленные репозитории (в обоих случаях); но обратите внимание, что параметр "destination" является пользовательским свойством "-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 в текущем каталоге)
майкл

Ответы:

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 . Так что я думаю, что мы должны использовать длинное имя пока (при использовании плагина без pom, что является идеей dependency:get).

Паскаль Тивент
источник
1
Да, и я только что получил такое же разрешение, используя зависимости: получить цель. Зависимость mvn: get -Dartifact = org.apache.archiva: archiva-webapp: LATEST: war -DrepoUrl = repository.sonatype.org/content/repositories/central Единственное неудобство заключается в том, что я должен предоставить параметр repoUrl. Ваша информация действительно помогает, я использую mvn 2.2.1 (rdebian-1), и я не трогал pluginRegistry. Спасибо.
Xiè Jìléi
2
эта цель "get", кажется, снова "просто работает" (дополнительные настройки / взлом не требуются; плагин 2.5.1, mvn 3.0.4): = пример => mvn org.apache.maven.plugins: maven-dependency-plugin: 2.5.1: get -DremoteRepositories = repo.maven.apache.org -Dartifact = org.apache.ant: ant: 1.8.1 -Ddest = ant-1.8.1.jar
майкл
В чем разница между получением и установкой? Разве они оба не принесли в ваш местный репозиторий 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

Пример, протестированный с 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. Это прекрасно работает, если вы находитесь за прокси-сервером и работаете с Eclipse, который не может зарегистрироваться, чтобы идентифицировать maven архетипы, даже если вы настроили прокси в настройках xml.
Асевин
mvn org.apache.maven.plugins: плагин maven-dependency-plugin: 2.8: get -Dartifact = org.apache.maven.archetypes: maven-archetype-webapp: 1.0: jar
Acewin
Можете ли вы объяснить, что jar:sourcesзначит / делает? почему нужно указывать "баночка"? и означает ли "источники", что он загрузит дополнительные зависимости, необходимые для артефакта?
red888
«jar» - тип упаковки, «sources» - классификатор. При наличии одной зависимости (например, hibernate-core ) может быть несколько артефактов. Часто имеются: 1. библиотека только для двоичных sourcesфайлов , 2. файл JAR, содержащий только исходные файлы Java, 3. файл JAR, содержащий только javadocдокументы API. См. Также: Обработчики артефактов по умолчанию Maven .
Данило Пьяццалунга
Спасибо за разъяснение того, как правильно использовать [:classifier], если у меня есть zip-файл, созданный плагином сборкой, который я хочу скачать.
jonashackt
43

Вот что сработало для меня, чтобы загрузить последнюю версию артефакта под названием "component.jar" с Maven 3.1.1 в конце (другие предложения этого не сделали, в основном из-за изменений в версии maven, я считаю)

Это фактически загружает файл и копирует его в локальный рабочий каталог

Из Баш:

mvn dependency:get \
    -DrepoUrl=http://.../ \
        -Dartifact=com.foo.something:component:LATEST:jar \
        -Dtransitive=false \
        -Ddest=component.jar \
verveguy
источник
Большое спасибо! Я не нуждалась в событии -DrepoUrl, я полагаю, это подразумевалось от моего помпона в любом случае. Кроме того, я не использовал , -Ddestкак я на самом деле сделал хотение его загрузки в регулярном .m2каталоге.
1
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
Полагаю, поддержка @Athlan No-pom может быть более новой. В настоящее время я могу просто бежать mvn dependency:copy(без dependency:getпервого).
Джейкоб Райле
26

Относительно того, как получить двоичный файл артефакта, ответ Паскаля Тивента таков , но чтобы также получить jar источников артефактов, мы можем использовать:

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.

ryenus
источник
17

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

Не все свойства плагина могут быть использованы в maven CLI. Можно указать свойства, для которых определено свойство «User Property:». В приведенном ниже примере я загружаю 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. И вы указываете artifcat как groupId: artifactId: версия [: пакет [: классификатор]]

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

aloksahoo
источник
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"
mrduguo
источник
3
Downvoted. Это решение работает только с конкретным продуктом репозитория.
Мартин Штраус
1
Отлично
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 dependency: get" для загрузки определенного артефакта и используйте команду "mvn dependency: copy", чтобы скопировать загруженный артефакт в dest dir "-DoutputDirectory"

user2310670
источник
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:[,)"
MariuszS
источник