【问题标题】:Using Maven to download dependencies to a directory on the command line使用 Maven 将依赖项下载到命令行上的目录
【发布时间】:2013-03-05 05:29:21
【问题描述】:

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

  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 复制传递依赖项的示例?

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

【问题讨论】:

  • 有个不错的antrun插件,可以试试吗?
  • 我假设您的意思是 maven.apache.org/plugins/maven-antrun-plugin 如何使用它来完成我想要完成的任务?
  • 我正在使用 antrun 插件的 run 目标来复制和移动目录,所以也许您可以将所有文件(jar、cfg 文件等)收集到一些文件夹并从那里转移它们?还是简单地使用 cp/xcopy ?
  • 这不会自动覆盖传递依赖。我真的在寻找一种方法,理想情况下,用一个或最多两个命令来做到这一点。你的建议会让我写一个脚本,这正是我想要避免的。感谢您为我澄清这一点。我会更新问题。

标签: java maven maven-3


【解决方案1】:

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

【讨论】:

  • 这是一个很好的答案,效果很好,但如果可能的话,我只想坚持使用 Maven。谢谢!
  • @JanusTroelsen 使用“-settings”选项传递指向您的仓库的常春藤设置文件。有关示例设置文件,请参阅:stackoverflow.com/questions/4836011/…
  • 为我工作。下载的socket.io java客户端命令java -jar ivy-2.3.0.jar -dependency io.socket socket.io-client 0.6.2 -retrieve "lib/[artifact]-[revision](-[classifier]).[分机]"
  • 或者,如果你知道你只需要一个 jar,没有依赖关系,同样的 curl 和 URL 模式可以得到那个单一的 jar。或者,对于 Dockerfile,ADD 命令。
  • 明白。只需注意 curl 技术和 URL 的其他用途,以防其他人在搜索该需求时找到此答案。像我一样:-)
【解决方案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 的其他选项来进一步优化下载的内容,例如通过添加 -DexcludeTypes=test-jar 来过滤掉测试 JAR。

【讨论】:

  • 关键是你要指定依赖插件的版本。旧版本需要一个 pom。
【解决方案3】:

据我了解,您希望将所有依赖项工件下载到本地计算机上的一个文件夹中(无需搜索本地存储库)。简单的方法是创建一个 simple 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 2017-08-13
    • 2011-12-16
    • 2015-01-16
    相关资源
    最近更新 更多