4

我对Maven真的很陌生。我对依赖功能有点困惑。我知道我可以像这样在 pom 文件中添加依赖项

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

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

我已经阅读了来自maven 站点的依赖,但对我没有多大帮助。

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

谢谢

4

4 回答 4

5

简而言之:这意味着您的项目依赖于 slf4j,版本 1.6.1。

此外:

  • 如果您使用 Maven 构建项目(或者您的 IDE 支持 Maven),则无需执行任何其他操作即可使用 slf4j。(除了正常的源代码考虑,如合理的import陈述等)
  • slf4j v. 1.6.1 将从默认的 Maven 存储库检索到您的本地存储库,这意味着......
  • ...~/.m2/repository是您的存储库。slf4j 将被放入$M2_HOME/org/slf4j/$(artifactId}/1.6.1并包含(通常)一个 jar 文件、一个 pom 文件和一个哈希文件。
  • Slf4j 的依赖项也将下载到您的本地存储库中。
  • 这些依赖项的依赖项将无限下载/令人作呕。(如果有很多依赖项,“第一次使用库下载互联网”的来源开玩笑;对于 slf4j 不是这种情况。)这是“传递依赖项管理”——Maven 最初的目的之一。
于 2011-12-03T18:00:14.093 回答
2

如果您不使用 maven,您将手动下载并使用项目所需的依赖项。您可能会将它们放在 lib 文件夹中,并在您的 IDE 和构建工具中指定此位置。

maven 为您管理这些依赖项。您以规定的格式指定项目所需的依赖项,然后 maven 从 Internet 为您下载并管理它们。在构建您的项目时,maven 知道将这些依赖项放在哪里并使用它们。大多数 IDE 在发现它是一个 maven 项目时也知道这些依赖项在哪里。

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

您的项目使用的此类依赖项越多,它就会变得越复杂。有可能两个依赖项最终使用了它们共有的不同版本的依赖项。

于 2011-12-03T18:01:09.303 回答
1

Internet 上有各种托管工件(jar)的服务器,您可以将其作为 maven 构建的一部分下载。您可以像上面显示的那样添加依赖项来描述构建代码所需的 jar。当 maven 开始构建时,它会联系这些服务器之一并将 jar 下载到您的计算机并通常将其放置在本地存储库中

${user_home}/.m2/repository

maven 联系的服务器必须在你的 maven 项目 pom 文件中配置,在类似的部分下

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

原型服务器可以在repo1.maven.org看到

maven 的好处是,如果需要您列出的 jar,它不仅会拉动该 jar,还会拉动该 jar 需要的任何 jar。显然,由于您将罐子拉到您的机器上,它只会在您的机器上找不到它们时才下载它们,因此不会每次都减慢您的构建速度(只是第一次)。

于 2011-12-03T17:50:56.840 回答
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>
于 2011-12-03T17:51:57.933 回答