Como posso baixar um artefato Maven específico em uma linha de comando?

168

Posso instalar um artefato install:install-file, mas como posso fazer o download de um artefato?

Por exemplo:

mvn download:download-file -DgroupId=.. -DartifactId=.. -Dversion=LATEST
Xiè Jìléi
fonte
11
Cuidado que o plugin deseja 'repoUrl', apesar da documentação dizendo 'repositoryUrl'. Pode deixá-lo louco, como aconteceu comigo!
Zakmck
os documentos ( maven.apache.org/plugins/maven-dependency-plugin/get-mojo.html ) mostram os parâmetros xml (<repositoryUrl> ... </repositoryUrl>) e as propriedades do usuário da linha de comando (mvn .. . -DrepoUrl = "..."). Este exemplo em particular está obsoleto, então não se preocupe; agora é agora uniformemente remoteRepositories (nos dois usos); mas observe que o parâmetro "destination" é a propriedade do usuário "-Ddest = ..."; eg => 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 (resultado: ant-1.8.1.jar no diretório atual)
michael

Respostas:

182

Você pode usar o plugin de dependência maven, que tem um bom dependency:getobjetivo desde a versão 2.1. Não há necessidade de um pom, tudo acontece na linha de comando.

Para ter certeza de encontrar o dependency:getobjetivo, você precisa dizer explicitamente ao maven para usar a versão 2.1, ou seja, você precisa usar o nome completo do plug-in, incluindo a versão:

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

ATUALIZAÇÃO: Nas versões mais antigas do Maven (anteriores à 2.1), é possível executar dependency:getnormalmente (sem usar o nome e a versão completos) forçando sua cópia do maven a usar uma versão específica de um plug-in.

Isso pode ser feito da seguinte forma:

1. Adicione a seguinte linha ao <settings>elemento do seu ~/.m2/settings.xmlarquivo:

<usePluginRegistry>true</usePluginRegistry>

2. Adicione o arquivo ~/.m2/plugin-registry.xmlcom o seguinte conteúdo:

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

Mas isso não parece mais funcionar com o maven 2.1 / 2.2. Na verdade, de acordo com a Introdução ao registro do plug-in , os recursos do plugin-registry.xmlforam redesenhados (para portabilidade) e o registro do plug - in está atualmente em um estado semi-inativo no Maven 2 . Então, acho que temos que usar o nome longo por enquanto (ao usar o plug-in sem pom, que é a ideia por trás dependency:get).

Pascal Thivent
fonte
1
Sim, e eu tenho a mesma resolução usando a dependência: obter objetivo. dependência do mvn: get -Dartifact = org.apache.archiva: archiva-webapp: ÚLTIMO: guerra -DrepoUrl = repository.sonatype.org/content/repositories/central O único inconveniente é que devo fornecer uma opção de repoUrl. Suas informações realmente ajudam, estou usando o mvn 2.2.1 (rdebian-1) e não toquei no pluginRegistry. Obrigado.
Xiè Jìléi
2
esse objetivo "get" parece "simplesmente funcionar" novamente (não é necessário configurar / invadir adicional; plugin 2.5.1, mvn 3.0.4): = exemplo => mvn org.apache.maven.plugins: maven-dependency-plugin: 2.5.1: get -DremoteRepositories = repo.maven.apache.org -Dartifact = org.apache.ant: formiga: 1.8.1 -Ddest = ant-1.8.1.jar
michael
Qual é a diferença entre obter e instalar? Os dois não buscam o seu repositório de maven local? --edit: espere, não, eu entendi agora; install é para que seus deps locais sejam copiados para o repositório m2 local, obtenha-os em um controle remoto.
precisa saber é o seguinte
4
encontrou, apenas anexar :jar:sourcesao artefato , consulte stackoverflow.com/a/31109185/537554
ryenus
1
Com versões mais recentes do Maven (por exemplo 3.6.0), você ainda pode fazê-lo com apenasmvn dependency:get -Dartifact=group-id:artefact-id:version
Scrutari
93

Com a versão mais recente (2.8) do Maven Dependency Plugin , o download de um artefato do Maven Central Repository é tão simples quanto:

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

onde groupId:artifactId:version, etc., estão as coordenadas do Maven

Um exemplo, testado com o Maven 2.0.9, Maven 2.2.1 e 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

(Obrigado a Pascal Thivent por fornecer sua maravilhosa resposta em primeiro lugar. Estou adicionando outra resposta, porque ela não caberia em um comentário e seria muito extensa para uma edição.)

Danilo Piazzalunga
fonte
Eu usei isso para baixar o arquétipo do maven. Isso funciona muito bem se você estiver atrás do proxy e trabalhando com o eclipse, que falha ao se registrar para identificar os arquétipos do maven, mesmo que você tenha configurado o proxy nas configurações xml.
Acewin 27/09/16
org.apache.maven.plugins MVN: maven-dependência plug-in-: 2,8: get -Dartifact = org.apache.maven.archetypes: maven-arquétipo-webapp: 1,0: Frasco
Acewin
Você pode explicar o que jar:sourcessignifica / faz? por que você precisa especificar "jar"? e "fontes" significa que ele fará download de dependências adicionais que o artefato exige?
red888
"jar" é o tipo de embalagem, "sources" é o classificador. Dada uma dependência (por exemplo, núcleo de hibernação ), pode haver mais de um artefato. Freqüentemente, existem: 1. a biblioteca somente binária, 2. sources, um arquivo JAR contendo apenas fontes Java, 3. javadoc, um arquivo JAR apenas com documentos da API. Consulte também: Manipuladores de artefatos padrão do Maven .
Danilo Piazzalunga
Obrigado por esclarecer como usar o [:classifier]corretamente, se eu tiver um arquivo zip criado pelo plugin assemlby que eu quero baixar.
jonashackt 03/04
43

Aqui está o que funcionou para mim para fazer o download da versão mais recente de um artefato chamado "component.jar" com o Maven 3.1.1 no final (outras sugestões não o fizeram, principalmente devido a alterações na versão do maven, acredito)

Na verdade, ele baixa o arquivo e o copia no diretório de trabalho local

Do bash:

mvn dependency:get \
    -DrepoUrl=http://.../ \
        -Dartifact=com.foo.something:component:LATEST:jar \
        -Dtransitive=false \
        -Ddest=component.jar \
verveguy
fonte
Ótimo, obrigado! Eu não precisava do evento -DrepoUrl, acho que estava implícito no meu pom de qualquer maneira. Também eu não utilizar -Ddestcomo I realmente fez falta a ele baixar a regular .m2diretório.
yair
15
O destparâmetro foi descontinuado e pode ser substituído por uma invocação de copyafter da seguinte getmaneira:mvn dependency:copy -Dartifact=com.foo.something:component:LATEST:jar -DoutputDirectory=. (neste caso, colocando o jar no diretório de trabalho).
Jacob Raihle 8/08/16
@JacobRaihle Então eu não posso baixar arquivo sem pom.xml, recebendo o seguinte erro: Goal requires a project to execute but there is no POM in this directory.
Athlan
2
O suporte a Athlan No-pom pode ser um recurso mais recente, suponho. Hoje em dia eu posso apenas correr mvn dependency:copy(sem dependency:getprimeiro).
Jacob Raihle
26

Com relação a como obter o binário do artefato, a resposta de Pascal Thivent é essa, mas também para obter o jar das fontes do artefato, podemos usar:

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

por exemplo

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

Isso funciona porque o artifactparâmetro realmente consiste em groupId:artifactId:version[:packaging][:classifier]. Apenas a embalagem e o classificador são opcionais.

Com jaro empacotamento e sourceso classificador , o plug-in de dependência maven entende que estamos solicitando o jar de fontes, não o jar de artefatos.

Infelizmente, por enquanto, os arquivos jar de fontes não podem ser baixados transitivamente, o que faz sentido, mas, idealmente, acredito que também pode respeitar a opção, downloadSourcesassim como o plugin maven eclipse.

ryenus
fonte
17

Pode-se usar dependência: copy ( http://maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html ), que pega uma lista de artefatos definidos na seção de configuração do plug-in e os copia para um local especificado , renomeie-os ou retire a versão, se desejar. Esse objetivo pode resolver os artefatos de repositórios remotos se eles não existirem no repositório local ou no reator.

Nem todas as propriedades do plug-in podem ser usadas no maven CLI. As propriedades que possuem a propriedade "User Property:" definida podem ser especificadas. No exemplo abaixo, estou baixando junit para minha pasta temp e removendo a versão do arquivo jar.

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

onde artefato = junit: junit: 4.11 são as coordenadas do maven. E você especifica artifcat como groupId: artifactId: version [: packaging [: classifier]]

(Obrigado a Pascal Thivent por fornecer seu https://stackoverflow.com/a/18632876/2509415 em primeiro lugar. Estou adicionando outra resposta)

aloksahoo
fonte
11

um liner para baixar o artefato mais recente do maven sem 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
fonte
3
Votado. Esta solução parece funcionar apenas com um produto de repositório específico.
Martín Straus 12/01
1
Funcionou muito bem com o Nexus 2.x, ainda não funciona com 3.x (em inglês)
HDave
curl: opção -J é desconhecida
xuehui
2

O uso da documentação oficial:

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

Para o meu caso, veja a resposta abaixo:

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

Use o comando "mvn dependency: get" para baixar um item específico e use o comando "mvn dependency: copy" para copiar o artefato baixado no diretório de destino "-DoutputDirectory"

user2310670
fonte
1

Aqui está um exemplo para obter o ASM-7 usando o Maven 3.6:

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

Ou você pode fazer o download do jar aqui: https://search.maven.org/search?q=g:org.ow2.asm%20AND%20a:asm e, em seguida,

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

O comando:

mvn install:install-file 

Normalmente instala o artefato em seu repositório local, portanto você não precisa fazer o download. No entanto, se você deseja compartilhar seu artefato com outras pessoas, será necessário implantar o artefato em um repositório central, consulte o plug-in de implantação - para obter mais detalhes.

Além disso, adicionar uma dependência ao seu POM buscará automaticamente todos os artefatos de terceiros necessários ao criar seu projeto. Ou seja, isso fará o download do artefato do repositório central.

Clinton
fonte
0

LATEST está obsoleto, tente com o intervalo [,)

./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
fonte