Maven依赖范围是编译项目中包含的依赖项?

时间:2012-11-23 14:27:06

标签: java eclipse maven dependencies m2e

E.g。如果我将BukkitApi jar作为maven项目的依赖项,并将detanecy范围设置为提供,编译,系统,运行时或测试

在哪个范围内bukkitAPI将包含在编译输出中?

2 个答案:

答案 0 :(得分:6)

短版本:默认情况下,maven输出(在默认的target目录中)不包含除当前项目/模块的已编译代码之外的任何内容。也就是说,没有任何依赖。

Long(呃)版本:默认jar打包,没有自定义阶段配置。这是maven在java项目中的行为方式:

  1. compile阶段:.java目录中的src/main/java/个文件被编译为.classes目录中的target个文件。 compile范围的依赖关系将下载到本地存储库。
  2. package阶段:与1相同,另外您将在jar目录中获得target个文件
  3. install阶段:与2相同,您将在本地存储库中获得jar文件。
  4. 因此,默认情况下,来自依赖项的.jar个文件不包含在任何内容中!

    那么,我如何在“输出”中包含依赖项,以及范围的含义是什么?

    现在,例如,使用assembly插件在package阶段的输出中包含依赖项(请参阅Including dependencies in a jar with Maven),您通常会得到以下默认行为:< / p>

    • provided:不包括
    • compile(默认):已包含
    • system:不包括
    • runtime:包含
    • test:不包括

    结帐this link以供参考。

    编辑:只需使用guice上的不同范围值尝试此pom,当范围为{{{}时,您会看到fake-1.0-SNAPSHOT-jar-with-dependencies.jar中包含依赖关系1}}和compile(此示例不需要任何源文件)

    runtime

答案 1 :(得分:3)

这不是Maven的工作方式。依赖项只指定类路径(用于编译,运行时,测试)。但默认情况下,依赖项不包含在输出中。您必须运送所有依赖项jar(至少是具有作用域编译和运行时的jar)。

看看依赖插件。它提供了复制依赖项的目标。

要创建发货包,请查看程序集插件(例如创建zip文件)。它甚至提供了一种创建一体化罐子的方法,如果这是你所追求的。