如何在一个命令行中下载特定的Maven工件?


168

我可以通过安装工件install:install-file,但是如何下载工件呢?

例如:

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

11
请注意,尽管文档说“ repositoryUrl”,但插件仍需要“ repoUrl”。它可以像对我一样使您发疯!
zakmck,2011年

文档(maven.apache.org/plugins/maven-dependency-plugin/get-mojo.html)显示了xml参数(<repositoryUrl> ... </ repositoryUrl>)和命令行用户属性(mvn .. -DrepoUrl =“ ...”)。此特定示例已弃用,因此无需担心。现在它现在是统一的remoteRepositories(两种用法);但请注意,参数“目标”是用户属性“ -Ddest = ...”;例如=> 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(结果:当前目录中的ant-1.8.1.jar)
michael

Answers:


182

您可以使用maven依赖插件,该插件dependency:get自2.1版本起就有一个不错的目标。无需pom,一切都在命令行中进行。

为了确保找到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
是的,而且我刚刚使用dependency:get target获得了相同的分辨率。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。谢谢。
耶利耶09年

2
这个“获取”目标似乎又可以“正常工作”(不需要其他配置/黑客;插件2.5.1,mvn 3.0.4):= example => 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
michael

get和install有什么区别?他们俩都不都去当地的Maven仓库吗?--edit:等等,不,我现在明白了;install是将您的本地部门复制到本地m2存储库,从远程获取它们。
Chris2048,2014年

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依赖插件,从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

(感谢Pascal Thivent首先提供了他的精彩回答。我添加了另一个答案,因为它不适合评论,而且对于编辑而言过于广泛。)


我用它来下载Maven原型。如果您在代理后面并且使用eclipse,即使您已在设置xml中配置了代理,但无法注册以标识maven原型,这将非常有用。
Acewin

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 '19

“ jar”是包装类型,“ sources”是分类器。给定一个依赖关系(例如hibernate-core),可能存在多个工件。通常,有:1.仅二进制库; 2. sources是仅包含Java源代码javadoc的JAR文件; 3. 是仅具有API文档的JAR文件。另请参阅:Maven默认工件处理程序
Danilo Piazzalunga

[:classifier]如果我有一个assemlby插件创建了要下载的zip文件,那么感谢您澄清如何正确使用。
jonashackt

43

这是我最后使用Maven 3.1.1下载最新版本的工件“ component.jar”的工作(其他建议没有用,主要是因为我相信Maven版本已更改)

实际上,这将下载文件并将其复制到本地工作目录中

从bash:

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

十分感谢!我没有事件需要-DrepoUrl,但我想它还是从pom暗示的。我也没有使用,-Ddest因为我确实希望将其下载到常规.m2目录。
yair

15
dest参数已弃用,可以用copyafter 代替,get例如:(mvn dependency:copy -Dartifact=com.foo.something:component:LATEST:jar -DoutputDirectory=.在这种情况下,将jar放在工作目录中)。
雅各布·赖勒

@JacobRaihle然后,我无法在没有pom.xml的情况下下载文件,出现以下错误:Goal requires a project to execute but there is no POM in this directory
Athlan

2
我想@Athlan No-pom支持可能是一个较新的功能。如今,我可以跑步了mvn dependency:copy(无需dependency:get首先)。
Jacob Raihle19年

26

关于如何获取工件二进制文件,Pascal Thivent的答案是它,但也要获取工件源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]。仅包装分类器是可选的。

使用jaras 包装sourcesas 分类器,maven依赖插件可以理解,我们是在请求源jar,而不是工件jar。

不幸的是,目前无法从源代码下载jar文件,这确实很有意义,但是理想情况下,我相信它也可以downloadSources像maven eclipse插件一样尊重该选项。


17

可以使用dependency:copy(http://maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html)来获取插件配置部分中定义的工件列表,并将其复制到指定位置,重命名它们或根据需要剥离版本。如果本地存储库或反应堆中都不存在远程工件,则此目标可以解决这些工件。

并非插件的所有属性都可以在maven CLI中使用。可以指定定义了“用户属性:”属性的属性。在下面的示例中,我将junit下载到我的temp文件夹中,并从jar文件中剥离了vesion。

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

其中artifact = junit:junit:4.11是Maven坐标。然后将artifcat指定为groupId:artifactId:version [:packaging [:classifier]]

(感谢Pascal Thivent首先提供了https://stackoverflow.com/a/18632876/2509415。我添加了另一个答案)


11

一线可下载不带mvn的最新Maven工件:

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
不赞成投票。该解决方案似乎仅适用于特定的存储库产品。
马丁·施特劳斯

1
与Nexus 2.x兼容,但与3.x
兼容

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

使用命令“ mvndependency:get”下载特定的aritfact,并使用命令“ mvndependency:copy”将下载的工件复制到dest dir“ -DoutputDirectory”


1

这是一个使用Maven 3.6获取ASM-7的示例:

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

或者,您可以从以下位置下载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 

通常,工件安装在本地存储库中,因此您无需下载它。但是,如果您想与他人共享工件,则需要将工件部署到中央存储库,有关更多详细信息,请参见deploy插件

此外,向您的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:[,)"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.