我需要将项目的所有传递依赖项下载到命令行上的目录,而没有pom.xml文件或其他脚本。理想情况下,我可以使用一个或两个命令执行此操作。据我所知,这至少是mvn的两步过程。
获取我运行的依赖项
$ mvn org.apache.maven.plugins:maven-dependency-plugin:2.6:get -DgroupId=org.jclouds.provider -DartifactId=rackspace-cloudservers-us -Dversion=1.5.8
哪个效果很好。不幸的是,dest param并没有帮助我,因为它不会将所有传递依赖项放在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复制传递依赖吗?
有没有更好的方法来做我在这里尝试完成的事情?
答案 0 :(得分:30)
Apache ivy可以作为standalone 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
答案 1 :(得分:24)
第一个命令几乎可以满足您的需求 - 相关依赖项的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
的其他选项来进一步细化下载的内容,例如通过添加-DexcludeTypes=test-jar
来过滤掉测试JAR。
答案 2 :(得分:1)
根据我的理解,您希望将所有依赖项工件下载到本地计算机上的一个文件夹中(无需搜索本地存储库)。这样做的简单方法是创建一个简单 pom.xml
(是,请创建pom ),它将创建WAR文件并依赖于您的工件。在mvn clean package
之后,您将在WAR的lib文件夹中找到所有依赖项工件(包括传递)。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>testwar</groupId>
<artifactId>examplewar</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>examplewar Maven Webapp</name>
<dependencies>
<dependency>
<groupId>org.jclouds.provider</groupId>
<artifactId>rackspace-cloudservers-us</artifactId>
<version>1.5.8</version>
</dependency>
</dependencies>
</project>