2012-02-21 98 views
22

我正在使用一个使用Maven编译和测试的库。
我能够毫无问题地编译库。编译时,它好像下载了库的所有依赖关系。将基于Maven的依赖项的传递依赖项收集到非Maven项目的类路径中

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

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

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

+4

+1,对于maven新手来说非常重要的问题。 – 2014-04-09 14:55:47

回答

14

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

mvn dependency:copy-dependencies 

在库文件夹内,它会将所有依赖关系罐复制到target/dependency。默认情况下,这也将包括仅用于测试的罐子,以排除您可以使用的这些罐子

mvn dependency:copy-dependencies -DincludeScope=runtime 
+2

酷黑客!它为我工作,但我的需求稍有不同。就我而言,获得类路径就足够了。您可以生成类路径并将其输出到资源中的某个文件,稍后可以使用它。代码是在这里' \t \t \t \t org.apache.maven.plugins \t \t \t \t 行家依赖性-插件 \t \t \t \t 产生来源积聚类路径<结构> \t \t \t $ {project.basedir}/src/main/resourc es/classpath' – raxith 2013-06-12 14:37:44

+0

@raxith将此作为自己的答案提交,代码段太长以至于无法解释。 – 2014-04-09 14:56:17

+0

@JörnHorstmann因此,在运行复制依赖目标之后,要运行代码,我们必须从项目文件夹执行'java -cp“target \ *; target \ dependency \ *”com.myCompany.App'。 – 2016-12-27 07:39:09

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构建库执行clean目标时,target文件夹都会被烧毁。

现在已经说了所有这些,为什么不调整您的项目以使用Maven呢?那么你所需要做的就是将顶级JAR作为依赖包含在你的POM中,而Maven将处理它的所有子依赖?这毕竟是Maven的力量 - 这对您的优势起到杠杆作用。

无论如何,您选择的两种方法中的任何一种都会带来好运。