将所有 Maven 依赖项下载到不在存储库中的目录?

Posted

技术标签:

【中文标题】将所有 Maven 依赖项下载到不在存储库中的目录?【英文标题】:Downloading all maven dependencies to a directory NOT in repository? 【发布时间】:2011-12-16 00:34:27 【问题描述】:

我开始将我的项目转换为 maven,因为我需要使用一个仅在 maven 上以二进制形式分发的库,但是在我的头撞到墙上太久之后,我决定停止伤害自己并且只使用蚂蚁。我只想让 maven 将 jar 及其所有传递依赖项下载到我选择的目录中,这样我就可以像往常一样将它们签入我的 SCM 并再次成为一名幸福的开发人员。 任何想法如何轻松做到这一点?

【问题讨论】:

考虑使用 Ivy 并通过您信任的 Ant 获得所需的传递依赖管理。或者硬着头皮使用 Maven 目录结构。 你试过Ivy吗? 不,但我已经把所有的耐心都花在了切换上。下次吧。我想回到编码。可以用maven做吗? How to use Maven pom to download jar files only to a specific directory?的可能重复 【参考方案1】:

maven dependency plugin 可能会解决您的问题。

如果您有一个 pom 并指定了所有项目依赖项,那么您需要做的就是运行

mvn dependency:copy-dependencies

您会发现target/dependencies 文件夹充满了所有依赖项,包括传递性。

添加Gustavo's answer from below:要下载依赖sources,可以使用

mvn dependency:copy-dependencies -Dclassifier=sources

(通过Apache Maven Dependency Plugin doc)。

【讨论】:

但是如果我想将所有依赖项复制到我的本地仓库怎么办?这应该是用来干嘛的?如果它可能已经在本地仓库中,为什么要复制。无论如何它是本地的。 @ses 默认情况下,标准的 maven 构建(例如编译、测试、打包、安装等;不确定是否验证)已经将所有依赖项复制到本地存储库。这不是为了那个。相反,它适用于您出于任何原因需要应用程序依赖项的情况。我现在正在使用它来检查依赖库中是否存在冗余 API 定义(例如,某些库将包含 Javax API,这可能与同一 API 的其他版本发生冲突),但如果您的应用程序需要与其打包的依赖项也很好用于分发或其他任何用途。 @Raghuram 从技术上讲,您最终会在“目标/依赖项”中获得所有(已解决的)工件。此外,由于忽略了依赖项的“groupId”坐标,因此存在名称冲突的潜在问题。换句话说,“dependency:copy-dependencies”不保留布局结构。 @whaefelinger。您只需将useRepositoryLayout 设置为true @Raghuram "dependency:copy-dependencies" 适用于普通 jars。它复制了“一些”传递依赖;无法弄清楚为什么有些人被排除在等式之外。此外,POM 和父 POM 被复制,但不保留布局结构;复制源 jar 也是如此。【参考方案2】:

根据@Raghuram的回答,我找到了Copying project dependencies上的教程,就:

    打开你的项目pom.xml文件并找到这个:

    <project>
      [...]
      <build>
        <plugins>
          ...
        </plugins>
      </build>
      [...]
    </project>
    

    &lt;plugins&gt; ... &lt;/plugins&gt; 替换为:

    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <outputDirectory>$project.build.directory/alternateLocation</outputDirectory>
              <overWriteReleases>false</overWriteReleases>
              <overWriteSnapshots>false</overWriteSnapshots>
              <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
    

    并在命令行中调用mavenmvn dependency:copy-dependencies

完成后,它将在jar 的所有依赖项中创建文件夹target/dependency,该文件夹位于pom.xml 所在的当前目录。

【讨论】:

在哪里输入“mvn”命令?右键单击 maven-project-> Maven -> .. ?? pom.xml 文件所在文件夹的终端命令行中。 没用。我认为 Maven 仅作为插件安装。我也必须手动下载 Maven。然后mvn dependency:copy-dependencies 工作了!【参考方案3】:

我找到了下一条命令

mvn dependency:copy-dependencies -Dclassifier=sources

这里maven.apache.org

【讨论】:

【参考方案4】:

请检查$MAVEN_HOME/conf 目录中是否有一些配置文件,例如settings.xml。 这些文件会覆盖 .m2 文件夹中的设置,因此,.m2 中的存储库文件夹可能不可见或被丢弃。

【讨论】:

【参考方案5】:

我终于想出了如何使用 Maven。在 Eclipse 中,创建一个新的 Maven 项目。

下载 Maven,解压缩存档,将 /bin 文件夹添加到路径中。

通过运行mvn -v从命令行验证安装(将打印版本和java安装路径)

更改到项目根文件夹(pom.xml 所在的位置)并运行:

mvn dependency:copy-dependencies

所有 jar 文件都下载到/target/dependency

设置另一个输出目录:

mvn dependency:copy-dependencies -DoutputDirectory="c:\temp"

现在可以通过更改 pom.xml 重新使用这个 Maven 项目来下载所有依赖项

通过构建路径将jars添加到java项目->配置构建路径->库->添加JARs..

【讨论】:

不一定是eclipse项目。我在 Java Decompiler 中打开了一个 jar 文件并将 pom.xml 复制到一个空文件夹中。正如您从该文件夹中描述的那样,我调用了mvn dependency:copy-dependencies,并将所有相关的 jar 文件很好地复制到了一个文件夹中。【参考方案6】:

我基于user 的简单脚本基于Raghuram。

getmvndep.sh

#!/bin/bash
groupId=$1
artifactId=$2
version=$3
echo "<project>"                                                      > pom.xml
echo "  <modelVersion>4.0.0</modelVersion>"                          >> pom.xml
echo "  <groupId>com.temp.temp</groupId>"                            >> pom.xml
echo "  <artifactId>temp</artifactId>"                               >> pom.xml
echo "  <packaging>jar</packaging>"                                  >> pom.xml
echo "  <version>0.0.0</version>"                                    >> pom.xml
echo "  <dependencies>"                                              >> pom.xml
echo "    <dependency>"                                              >> pom.xml
echo  "     <groupId>$groupId</groupId>"                           >> pom.xml
echo  "     <artifactId>$artifactId</artifactId>"                  >> pom.xml
echo  "     <version>$version</version>"                           >> pom.xml
echo "    </dependency>"                                             >> pom.xml
echo "  </dependencies>"                                             >> pom.xml
echo "  <build>"                                                     >> pom.xml
echo "    <plugins>"                                                 >> pom.xml
echo "    </plugins>"                                                >> pom.xml
echo "  </build>"                                                    >> pom.xml
echo "</project>"                                                    >> pom.xml
mvn dependency:copy-dependencies -DoutputDirectory="./libs/$version"
rm pom.xml

【讨论】:

以上是关于将所有 Maven 依赖项下载到不在存储库中的目录?的主要内容,如果未能解决你的问题,请参考以下文章

如何从maven存储库中清除旧的依赖项?

如何通过Gradle将所有依赖项复制到Maven存储库?

Maven:包括在公共存储库中找不到的 jar

Netbeans:pom 类型的 Maven 依赖项

怎么将 服务器 maven库中的所有的jar 下载到本地的计算机上,带目录结构的 ,是所有的

Gradle在本地Maven存储库中找不到现有的依赖项