7

我肯定错过了什么。我已经搜索和搜索,玩过和修补过,但我仍然无法弄清楚如何使用 Maven 执行以下操作:

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

有依赖:get,这是接近但没有雪茄的。使用dependency:get,根据每个工件的groupId 和artifactId 将所有工件下载到本地mvn 存储库中的目录下。这不是我想要的,因为你必须在所有这些目录中跋涉才能拿到罐子。我希望将所有文件下载到一个目录,以便它们在一个地方。

然后是依赖:复制依赖。这又做了几乎我想要的;它将工件的所有依赖项复制到目标/依赖项中。这样做的两个问题是 1)您需要有一个 pom.xml;您不能像使用依赖项:get 那样指定任意坐标,并且 2) 依赖项:复制依赖项不会将主工件本身复制到目标/依赖项中。

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

4

3 回答 3

1

使用 maven 程序集插件将附加的“带有依赖项的 jar”打包到包含所有内容的 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>

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

于 2011-03-02T00:11:39.353 回答
1

您可以结合使用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
于 2019-05-29T19:57:58.937 回答
0

如果你“想给某人一组 maven 坐标”,最好把它们放在一个特殊的 pom.xml 中(你必须在任何地方写下来)。这个 pom 不是您的“主要工件”的 pom,但具有“主要工件”作为依赖项。打包类型可以是pom因为这个项目本身不会创建任何工件。

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

于 2011-02-28T21:09:37.300 回答