Maven:将工件及其deps下载到特定目录

时间:2011-02-28 18:59:55

标签: maven-2 maven-dependency-plugin

我一定错过了什么。我搜索和搜索,玩和修改,我仍然无法弄清楚如何使用Maven进行以下操作:

我想从我们的内部Nexus服务器下载一个工件及其所有依赖项(和传递依赖项)到用户指定的位置。这里的想法是允许正在将生产解决方案部署到生产环境中的人员在一个地方轻松获取所需的所有jar文件。

有依赖性:得到,这是接近但没有雪茄。依赖:get,根据每个工件的groupId和artifactId,将所有工件下载到本地mvn存储库中的目录下。这不是我想要的,因为那时你必须绕过所有这些目录来获取罐子。我希望将所有文件下载到一个目录中,以便它们在一个地方。

然后是依赖:copy-dependencies。这几乎可以做到我想要的;它将所有工件的deps复制到目标/依赖项中。这有两个问题:1)你需要一个pom.xml;你不能像依赖项那样指定任意坐标:get,和2)依赖:copy-dependencies不会将主工件本身复制到目标/依赖项中。

必须有更好的方法来做到这一点,但我无法弄清楚在哪里寻找解决方案。总而言之,我希望能够为某人提供一组maven坐标(groupId:artifactId:version)和我们的内部Nexus URL,并让他们用一个命令将所有内容下载到他们选择的目录中。

3 个答案:

答案 0 :(得分:1)

使用maven程序集插件将附加的“jar with dependencies”打包到包含所有内容的ZIP文件中。

http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
  <!-- TODO: a jarjar format would be better -->
  <id>jar-with-dependencies</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <outputDirectory>/</outputDirectory>
      <useProjectArtifact>true</useProjectArtifact>
      <unpack>true</unpack>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
</assembly>

然后,除了常规的“maven坐标”之外,用户还可以请求<type>zip</type>以获取包含所有依赖项的zip文件。

答案 1 :(得分:0)

如果你“想要给某人一套maven坐标”,那么最好将它们放在一个特殊的pom.xml中(你必须把它们写在任何地方)。这个pom不是你的“主要工件”的pom,而是将“主要工件”作为依赖。包装类型可以是pom,因为此项目本身不会创建任何artifcat。

然后使用已经评估的dependency:copy-dependencies解决方案,您将获得所需的所有依赖项。恕我直言,优雅而简单的解决方案我不知道更好。

答案 2 :(得分:0)

您可以结合使用dependency:copydependency:copy-dependencies来实现您的目标。

这个想法很简单:

  1. 使用dependency:copy来获取起始工件的pom.xml
  2. 使用dependency:copy-dependencies向您提供上一步中获取的pom.xml,以获取所有起始工件的依赖项。
  3. 再次使用dependency:copy来获取起始工件本身。
#!/bin/sh

if [ "$#" -ne 2 ]; then
    echo "Usage: $(basename $0) <artifact> <directory>" > /dev/stderr
    exit 1
fi

ARTIFACT="$1"
OUTPUT="$2"

mkdir -p "$OUTPUT"

TMP=$(mktemp -d)
trap 'rm -rf "$TMP"' EXIT

mvn dependency:copy              "-DoutputDirectory=${TMP}"    "-Dartifact=${ARTIFACT}:pom"

POM=$(find "$TMP" -type f)

mvn dependency:copy              "-DoutputDirectory=${OUTPUT}" "-Dartifact=${ARTIFACT}"
mvn dependency:copy-dependencies "-DoutputDirectory=${OUTPUT}" -f "$POM" -DincludeScope=runtime

另存为download-jars并像这样使用:

download-jars org.apache.hadoop:hadoop-aws:2.7.3 /tmp/jars