2011-12-03 194 views
4

我对maven非常陌生。我对依赖特性有点困惑。我知道我可以像这样在pom文件中添加依赖关系Maven中的依赖

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.6.1</version> 
</dependency> 

这实际上是什么意思?这是否意味着我不需要将slf4j jar文件导入到我的项目中?如果是这样,我的项目如何访问这些库?

我已经从maven site读了依赖关系,但没有帮助我很多。

有人可以用更简单的方式解释它。

感谢

回答

5

一言以蔽之:这意味着你的项目对SLF4J的依赖,版本1.6.1。

此外:

  • 如果你用Maven构建你的项目(或您的IDE是Maven的感知),你不必做任何事情,才能使用SLF4J。 (除了正常的源代码的考虑,像一个合理的import声明等)
  • SLF4J诉1.6.1将默认的Maven仓库中检索到你的本地库,这意味着...
  • ... ~/.m2/repository是您的存储库。 slf4j将被放入$M2_HOME/org/slf4j/$(artifactId}/1.6.1中,并且将包括(通常)一个jar文件,一个pom文件和一个散列文件。
  • Slf4j的依赖关系也将被下载到您的本地存储库中。
  • 那些的依赖关系将被下载ad infinitum/ad nauseum。 (如果存在很多依赖关系,“首次使用图书馆下载互联网”的来源是笑话;而不是slf4j的情况。)这是“传递性依赖管理” - Maven的原始目的之一。
1

目前在互联网上的各种服务器的主机工件(罐),您可以下载作为Maven构建的一部分。您可以添加像上面显示的依赖关系来描述构建代码所需的jar。当Maven去打造,它将与这些服务器中的一个和JAR下载到您的计算机,并放置在一个本地仓库通常

${user_home}/.m2/repository 

Maven在接触必须在Maven项目的pom文件中配置的服务器,在像

<repositories> 
    <repository> 
    </repository> 
</repositories> 

一节中的原型服务器可以在repo1.maven.org

关于Maven的好处是,如果需要一个罐子,你列表,它会拉动不仅如此罐子,但任何广口瓶可以看出,那个罐子需要。很明显,因为你将罐子拉到你的机器上,所以只有在你的机器上找不到它们时才会下载它们,因此不会每次(只是第一次)减慢你的构建。

1

编译项目时,Maven会从存储库(通常是中央存储库)下载相应的.jar文件(您可以配置不同的存储库,用于镜像或​​用于您自己的库,这些库不可用于中央存储库) 。

如果您的IDE了解Maven,它将解析pom并自行下载依赖关系或要求Maven这样做。然后它会打开依赖关系的jar包,这就是你如何获得自动完成:IDE在幕后为你“导入”你的jar。

存储库不仅包含依赖关系的“.jar”文件,还包含描述其依赖关系的“.pom”文件。所以,maven会递归地下载它的依赖关系,并且你将得到编译你的软件所需的所有jar。然后,当你尝试运行你的软件时,你将不得不告诉JVM在哪里找到这些依赖关系(即,你必须把它们放在类路径中)。

我通常所做的就是将依赖关系复制到target/lib/目录,因此部署软件和启动它很容易。要做到这一点,你可以使用maven-dependency-plugin,您在<build>注明:

<build> 
    <plugin> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <version>2.1</version> 
    <executions> 
     <execution> 
     <phase>package</phase> 
     <goals> 
      <goal>copy-dependencies</goal> 
     </goals> 
     <configuration> 
      <outputDirectory>${project.build.directory}/lib</outputDirectory> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 
</build> 
2

如果您不使用maven,那么您需要手动下载并使用您项目所需的依赖关系。你可能会把它们放在一个lib文件夹中,并在IDE中指定这个位置以及你的构建工具。

maven为您管理这些依赖关系。您可以使用指定的格式指定项目所需的依赖项,并且Maven会从互联网为您下载并管理它们。在构建项目时,maven知道它放置这些依赖项的地方并使用它们。当大多数IDE发现它是一个Maven项目时,它们也知道这些依赖项在哪里。

为什么这是一件大事?通常,大多数开源库会定期发布更新的版本。如果您的项目使用这些,那么每次需要更新的版本时,您都需要手动下载并管理它。更重要的是,每个依赖关系可能会有其他依赖关系(称为传递依赖关系)。如果你不使用maven,你也需要识别,下载和管理这些传递依赖。

您的项目使用的依赖性越多,它就越复杂。有可能两个依赖关系最终会使用它们通用的不同版本的依赖关系。