使用 Maven 将依赖项下载到命令行上的目录

2022-09-01 15:08:29

我需要将项目的所有可传递依赖项下载到命令行上的目录中,而无需pom.xml文件或其他脚本。理想情况下,我可以使用一个或两个命令来执行此操作。据我所知,这至少是使用mvn的2步过程。

  1. 将依赖项下载到本地存储库
  2. 将依赖项复制到 lib 目录

获取我运行的依赖项

$ mvn org.apache.maven.plugins:maven-dependency-plugin:2.6:get -DgroupId=org.jclouds.provider -DartifactId=rackspace-cloudservers-us -Dversion=1.5.8

这很好用。不幸的是,dest参数对我没有帮助,因为它不会将所有可传递的依赖项放在dest中。

所以现在我需要将该JAR文件及其所有可传递依赖项复制到我的lib目录中。我知道这部分在StackOverflow上已经被问了很多次,但还没有任何东西对我有用。我尝试了以下方法。

$ mvn dependency:copy-dependencies ...
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-dependency-plugin:2.1:copy-dependencies (default-cli): Goal requires a project to execute but there is no POM in this directory

$ mvn dependency:copy ...
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-dependency-plugin:2.1:copy (default-cli): Goal requires a project to execute but there is no POM in this directory

通过阅读StackOverflow上的文档和其他答案,我认为我可以在没有pom的情况下从命令行使用它们.xml但mvn似乎需要一个。我的 Maven 版本是 Apache Maven 3.0.4 (r1232337; 2012-01-17 02:44:56-0600)。

任何人都可以给我一个在没有pom.xml的情况下使用mvn复制传递依赖项的示例吗?

有没有更好的方法来做我在这里尝试完成的事情?


答案 1

Apache ivy可以作为一个独立的jar运行来下载Maven依赖项。无需 POM。

curl -L -O http://search.maven.org/remotecontent?filepath=org/apache/ivy/ivy/2.3.0/ivy-2.3.0.jar
java -jar ivy-2.3.0.jar -dependency org.jclouds.provider rackspace-cloudservers-us 1.5.8 -retrieve "lib/[artifact]-[revision](-[classifier]).[ext]"

生成以下文件:

├── ivy-2.3.0.jar
└── lib
    ├── aopalliance-1.0.jar
    ├── asm-3.1.jar
    ├── bcprov-jdk16-1.46.jar
    ├── cglib-2.2.1-v20090111.jar
    ├── clojure-1.3.0.jar
    ├── core.incubator-0.1.0.jar
    ├── gson-2.2.jar
    ├── guava-13.0.jar
    ├── guice-3.0.jar
    ├── guice-assistedinject-3.0.jar
    ├── javax.inject-1.jar
    ├── jclouds-compute-1.5.8.jar
    ├── jclouds-core-1.5.8.jar
    ├── jclouds-scriptbuilder-1.5.8.jar
    ├── jsr250-api-1.0.jar
    ├── jsr311-api-1.1.1.jar
    ├── openstack-keystone-1.5.8.jar
    ├── openstack-nova-1.5.8.jar
    ├── rackspace-cloudidentity-1.5.8.jar
    ├── rackspace-cloudservers-us-1.5.8.jar
    ├── rackspace-cloudservers-us-1.5.8-javadoc.jar
    ├── rackspace-cloudservers-us-1.5.8-sources.jar
    ├── rocoto-6.1.jar
    └── tools.logging-0.2.3.jar

答案 2

第一个命令几乎可以满足您的需求 - 所讨论的依赖项的POM。一旦你有了它,你就不需要一个进一步的项目POM来运行:copy:dependencies

下面是一个示例:

mvn org.apache.maven.plugins:maven-dependency-plugin:2.7:get -DgroupId=org.jclouds.provider -DartifactId=rackspace-cloudservers-us -Dversion=1.5.8 -Dtype=pom

mvn org.apache.maven.plugins:maven-dependency-plugin:2.7:copy-dependencies -f /path/to/m2/repo/org/jclouds/provider/rackspace-cloudservers-us/1.5.8/rackspace-cloudservers-us-1.5.8.pom -DoutputDirectory=/path/to/target/dir/don't/use/.

正如Everett Toews所指出的,您可以使用copy:dependencies的其他选项来进一步优化下载的内容,例如通过添加以过滤掉测试JAR。-DexcludeTypes=test-jar


推荐