【问题标题】:Collecting Maven-based dependency's transitive dependencies to a non-Maven project's classpath将基于 Maven 的依赖项的传递依赖项收集到非 Maven 项目的类路径
【发布时间】:2012-03-12 06:16:02
【问题描述】:

我正在使用一个使用 Maven 编译和测试的库。
我能够毫无问题地编译库。在编译时,它似乎下载了库的所有依赖项。

现在,我正在尝试在我的项目中使用该库。当我编译库时,我发现在库文件夹中创建了一个名为target 的文件夹,并且在该文件夹内,还有另一个名为classes 的文件夹。我将classes 文件夹添加到我的类路径中。但是,每当我尝试在我的项目中使用不使用 Maven 的库时,它都会说找不到该库的依赖项。

如何将该库的所有依赖项添加到我的类路径中?
我是否需要手动下载所有库的依赖项并将它们添加到类路径中?
有什么办法可以让 Maven 为我做到这一点?
我需要做什么才能在我的项目中使用该库?

我的项目与库位于完全不同的目录中。现在,我的项目似乎能够正确加载库文件,但不能正确加载库依赖项。

【问题讨论】:

  • +1,对于 maven 新手来说非常重要的问题。

标签: java maven classpath


【解决方案1】:

嗯,这里有几个问题在起作用。 Maven 努力找出构建库所需的所有依赖项并下载它们。这些依赖项本地存储在您的 Maven 存储库 (<user home>/.m2/repository) 中,但除非需要它们作为程序集的一部分,否则您不会在 target 文件夹中找到它们。至少,默认情况下不是。您首先需要做的是让 Maven 将所有依赖项存储在构建文件夹中(此 POM 摘录来自another SO post):

<project>
...
    <profiles>
        <profile>
            <id>qa</id>
            <build>
                <plugins>
                    <plugin>
                        <artifactId>maven-dependency-plugin</artifactId>
                            <executions>
                                <execution>
                                    <phase>install</phase>
                                    <goals>
                                        <goal>copy-dependencies</goal>
                                    </goals>
                                    <configuration>
                                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                                    </configuration>
                                </execution>
                            </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

通过上面显示的 POM 更改,您现在应该能够获取库所需的所有 JAR 依赖项并将它们包含在您的类路径中(来自target/lib)。我建议将它们复制到工作站上的另一个文件夹,因为每次执行 Maven 构建库的 clean 目标时,target 文件夹都会被删除。

既然说了这么多,为什么不让您的项目也使用 Maven?那么您需要做的就是在您的 POM 中包含顶级 JAR 作为依赖项,而 Maven 将处理它的所有子依赖项?毕竟这就是 Maven 的力量——利用它对你有利。

无论如何,祝您好运,无论您选择哪种方法。

【讨论】:

    【解决方案2】:

    当您为该库执行mvn install 时,它应该已经创建了一个jar 文件并将其放在target/libaryname-version.jar。最好依赖这个最终的 jar,而不是 classes 文件夹的内容。 Maven 还有一个目标是下载项目的所有依赖项。你可以执行

    mvn dependency:copy-dependencies
    

    在库文件夹中,它将所有依赖项 jar 复制到 target/dependency。默认情况下,这还将包括仅用于测试的 jar,排除这些您可以使用

    mvn dependency:copy-dependencies -DincludeScope=runtime
    

    【讨论】:

    • 酷黑客!它对我有用,但我的需求略有不同。就我而言,获得类路径就足够了。您可以生成类路径并将其输出到资源中的某个文件,以便以后使用。代码在这里&lt;plugin&gt; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt; &lt;artifactId&gt;maven-dependency-plugin&lt;/artifactId&gt; &lt;executions&gt;&lt;execution&gt;&lt;phase&gt;generate-sources&lt;/phase&gt;&lt;goals&gt;&lt;goal&gt;build-classpath&lt;/goal&gt;&lt;/goals&gt;&lt;configuration&gt; &lt;outputFile&gt;${project.basedir}/src/main/resources/classpath&lt;/outputFile&gt;&lt;/configuration&gt;&lt;/execution&gt;&lt;/executions&gt;&lt;/plugin&gt;
    • @raxith 将此作为您自己的答案提交,代码部分太长无法解释。
    • @Jörn Horstmann 所以在运行复制依赖目标之后,要运行我们必须从项目文件夹中执行java -cp "target\*;target\dependency\*" com.myCompany.App 的代码?
    猜你喜欢
    • 2017-09-18
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    相关资源
    最近更新 更多