将基于Maven的依赖项传递依赖项收集到非Maven项目类路径

时间:2012-02-21 22:07:01

标签: java maven classpath

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

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

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

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

2 个答案:

答案 0 :(得分:14)

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

mvn dependency:copy-dependencies

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

mvn dependency:copy-dependencies -DincludeScope=runtime

答案 1 :(得分:4)

嗯,这里有几个问题在起作用。 Maven努力确定构建和下载库所需的所有依赖项。这些依赖项本地存储在Maven存储库(<user home>/.m2/repository)中,但除非它们作为程序集的一部分需要,否则您将无法在target文件夹中找到它们。至少,不是默认情况下。首先需要做的是让Maven将所有依赖项存储在build文件夹中(这个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构建库的target目标时,clean文件夹都会被激活。

现在说了这么多,为什么不调整你的项目以使用Maven呢?那么您需要做的就是将顶级JAR作为POM中的依赖项包含在内,Maven将处理其所有子依赖项?毕竟这就是Maven的力量 - 利用它对你有利。

无论如何,祝你选择两种方法中的任何一种都好运。