简体   繁体   中英

Using Maven to download dependencies to a directory on the command line

I need to download all transitive dependencies of a project to a directory on the command line without having a pom.xml file or other script. Ideally I would be able to do this with one or two commands. From what I can tell, this is at least a 2 step process with mvn.

  1. Download dependencies to the local repository
  2. Copy the dependencies to the lib directory

To get the dependencies I run

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

Which works great. Unfortunately the dest param doesn't help me as it won't put all transitive dependencies in the dest.

So now I need to copy that JAR file and all of its transitive dependencies into my lib directory. I know this part has been asked many time on StackOverflow but nothing has worked for my yet. I've tried the following.

$ 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

and

$ 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

From reading the documentation and other answers here on StackOverflow for copy-dependencies and copy I thought I would be able to use them from the command line without a pom.xml but mvn seems to need one. My Maven version is Apache Maven 3.0.4 (r1232337; 2012-01-17 02:44:56-0600).

Can anyone give me an example of copying transitive dependencies using mvn without a pom.xml?

Is there a better way to do what I'm trying accomplish here?

Apache ivy can be run as a standalone jar to download Maven dependencies. No POM required.

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]"

Produces the following files:

├── 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

The first command almost gets you what you need - the POM of the dependency in question. Once you have that, you should not need a further project POM to run copy:dependencies :

Here's an example:

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

As pointed out by Everett Toews , you can use additional options of copy:dependencies to further refine what's downloaded, eg by adding -DexcludeTypes=test-jar to filter out the test JARs.

According to my understanding you want to download all dependencies artifacts to one folder on your local computer (without search your local repository). The simple way to do it is to create a simple pom.xml ( yes, please create the pom ) that will create the WAR file and will depend on your artifact. After mvn clean package your will find all dependencies artifacts (include transitive) in the lib folder of the WAR.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM