Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Maven中的依赖关系_Java_Maven_Dependency Management_Maven Dependency Plugin - Fatal编程技术网

Java Maven中的依赖关系

Java Maven中的依赖关系,java,maven,dependency-management,maven-dependency-plugin,Java,Maven,Dependency Management,Maven Dependency Plugin,我对maven真的很陌生。我对依赖特性有点困惑。我知道我可以像这样在pom文件中添加依赖项 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.6.1</version> </dependency> org.slf4j 但是帮不了我多少忙 有人能用更简

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

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

org.slf4j
但是帮不了我多少忙

有人能用更简单的方式解释吗


谢谢

互联网上有各种各样的服务器,它们承载着工件(JAR),您可以作为maven构建的一部分下载这些工件。您可以添加上面所示的依赖项,以描述构建代码所需的jar。当maven开始构建时,它将联系其中一个服务器并将jar下载到您的计算机中,并将其放置在本地存储库中

${user_home}/.m2/repository
maven联系人的服务器必须在maven项目pom文件中的以下部分中进行配置

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

原型服务器可以在以下位置看到:


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

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

如果您的IDE知道Maven,它将解析
pom
,并下载依赖项本身或要求Maven这样做。然后它将打开依赖项的JAR,这就是您获得自动完成的方式:IDE在幕后为您“导入”JAR

存储库不仅包含依赖项的“.jar”文件,还包含描述其依赖项的“.pom”文件。因此,maven将递归下载其依赖项,您将获得编译软件所需的所有jar

然后,当您尝试运行软件时,您必须告诉JVM在哪里可以找到这些依赖项(即,您必须将它们放在类路径上)

我通常做的是将依赖项复制到
目标/lib/
目录中,这样就很容易部署和启动软件。为此,您可以使用
maven依赖项插件
,这是您在
中指定的:


maven依赖插件
2.1
包裹
复制依赖项
${project.build.directory}/lib

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

此外:

  • 如果您使用Maven构建项目(或者您的IDE支持Maven),那么使用slf4j不需要做任何其他事情(除了正常的源代码考虑,比如合理的
    import
    语句等)
  • slf4j v.1.6.1将从默认Maven存储库检索到本地存储库,这意味着
  • ~/.m2/repository
    是您的存储库。slf4j将放在
    $m2\u HOME/org/slf4j/$(artifactId}/1.6.1
    中,通常包括一个jar文件、一个pom文件和一个哈希文件
  • Slf4j的依赖项也将下载到您的本地存储库中
  • 这些依赖项的依赖项将被无限期地下载(如果存在大量依赖项,“首次使用库下载互联网”的来源是开玩笑的;slf4j则不是这样。)这是“可传递的依赖项管理”——Maven最初的目的之一

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

maven为您管理这些依赖项。您可以使用指定的格式指定项目所需的依赖项,maven可以从internet上为您下载并管理这些依赖项。在构建项目时,maven知道这些依赖项的位置并使用它们。大多数IDE在发现这些依赖项时也知道它们的位置这是一个专业的项目

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

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

<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>