Maven引入外部依赖

本文介绍了Maven中的依赖管理机制,包括如何在pom.xml中声明依赖项,依赖项的四个基本属性(groupId、artifactId、version和scope),依赖项的获取来源以及依赖范围的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  您可能已经注意到我们一直在使用的POM中的依赖项元素。实际上,你一直都在使用外部依赖项,但这里我们会详细讨论它的工作原理。

  pom.xmldependencies列表列出了我们的项目需要构建的所有外部依赖项(它是否需要在编译时、测试时、运行时,或者其他什么)。现在,我们的项目只依赖于JUnit(为了清楚起见,我把所有的资源过滤都去掉了):

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>Maven Quick Start Archetype</name>
  <url>http://maven.apache.org</url>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

  对于每个外部依赖项,您需要至少定义4个东西:groupIdartifactIdversionscopegroupIdartifactIdversion都与pom.xml中所提供的相同。用于构建该依赖项。scope元素指示您的项目如何使用该依赖项,并且可以是compiletestruntime时的值。

  有了关于依赖关系的信息,Maven将能够在构建项目时引用依赖项。Maven从哪里引用依赖关系?Maven在您的本地存储库中(${user.home}/.m2/repository是默认的位置)以查找所有的依赖项。在前一节中,我们将该工件从我们的项目(my-app-1.0-SNAPSHOT.jar)安装到本地存储库中。一旦它安装在那里,另一个项目就可以通过将依赖信息添加到它的pom.xml:将jar作为依赖项来引用。

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-other-app</artifactId>
  ...
  <dependencies>
    ...
    <dependency>
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-app</artifactId>
      <version>1.0-SNAPSHOT</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

  每当项目引用本地存储库中不可用的依赖项时,Maven将从远程存储库下载依赖项到本地存储库。当您构建第一个项目时,您可能注意到Maven下载了很多东西(这些下载是用于构建项目的各种插件的依赖项)。默认情况下,远程Maven存储库使用可以(浏览)在http://repo.maven.apache.org/maven2/上找到。您还可以设置自己的远程存储库(可能是公司的中心存储库),而不是使用默认的远程存储库。有关存储库的更多信息,您可以参考存储库的简介。

  让我们为我们的项目添加另一个依赖项。假设我们已经在代码中添加了一些日志记录,并且需要将log4j作为一个依赖项添加。首先,我们需要知道对于log4jgroupIdartifactIdversion是什么。我们可以在浏览器中搜索ibiblio寻找它,或者使用谷歌搜索“site:www.ibiblio.org maven2 log4j”。搜索显示一个目录名为/maven2/log4j/log4j (或/pub/packages/maven2/log4j/log4j)。在该目录中有一个名为maven-metadata.xml的文件。以下是log4j的maven-metadata.xml看起来是这样的:

<metadata>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.1.3</version>
  <versioning>
    <versions>
      <version>1.1.3</version>
      <version>1.2.4</version>
      <version>1.2.5</version>
      <version>1.2.6</version>
      <version>1.2.7</version>
      <version>1.2.8</version>
      <version>1.2.11</version>
      <version>1.2.9</version>
      <version>1.2.12</version>
    </versions>
  </versioning>
</metadata>

  从这个文件中,我们可以看到我们想要的是“log4j”,而artifactId是“log4j”。我们看到许多不同的版本值可供选择;现在,我们将使用最新版本1.2.12(一些maven-metadata.xml文件还可以指定哪个版本是当前版本的版本)。在maven-metadata.xml文件,我们可以看到对应于log4j库的每个版本的目录。在这些文件中,我们将找到实际的jar文件(例如:log4j-1.2.12.jar)以及pom文件(这是依赖项的pom.xml,表示它可能拥有的任何进一步的依赖关系以及其他信息)和另一个maven-metadata.xml文件。还有一个对应于这些文件的md5文件,其中包含了这些文件的md5哈希。您可以使用它来对库进行身份验证,或者找出您可能正在使用的某个特定库的哪个版本。

  现在我们已经知道了所需的信息,我们可以将依赖项添加到我们的pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>Maven Quick Start Archetype</name>
  <url>http://maven.apache.org</url>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.12</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

  现在,当我们编译这个项目(mvn compile)时,我们将看到Maven下载log4j依赖项。

  详细的代码可以参考下面的链接:

  最后再贴上Maven依赖的范围:

标签名称标签解释
compile这是默认范围,如果没有指定,就使用它。在所有类路径中都可以使用编译依赖项。此外,这些依赖关系被传播到依赖的项目中。
provided这非常类似于编译,但是表明您希望JDK或容器在运行时提供它。它只在编译和测试类路径中可用,且不具有传递性。
runtime这个范围表明了对编译的依赖不是必需的,而是用于执行。它在运行时和测试类路径中,而不是编译类路径。
test该范围表明,对应用程序的正常使用不需要依赖项,并且只适用于测试编译和执行阶段。它不传递。
system这个范围类似于提供的,除非您必须提供明确地包含它的JAR。工件总是可用的,并且没有在存储库中查找。
### 如何在 IntelliJ IDEA 中通过 Maven 引入外部 JAR 包 #### 方法概述 为了使项目能够成功引入外部 JAR 包并通过 Maven 进行管理,推荐使用方法2,即将外部 JAR 包作为依赖项加入到项目的 `pom.xml` 文件中。这种方法不仅可以在本地环境中运行程序,还能够在打包部署时确保 JAR 包被正确包含。 --- #### 步骤说明 1. **安装外部 JAR 包至本地仓库** 需要先将目标 JAR 包手动安装到本地 Maven 仓库中。可以通过命令行执行以下操作: ```bash mvn install:install-file -Dfile=<path-to-your-jar> -DgroupId=<your-group-id> -DartifactId=<your-artifact-id> -Dversion=<your-version> -Dpackaging=jar ``` 其中 `<path-to-your-jar>` 是外部 JAR 的绝对路径;`<your-group-id>` 和 `<your-artifact-id>` 应当自定义命名以便于识别该库的作用域[^1]。 2. **修改 pom.xml 文件** 安装完成后,在项目的 `pom.xml` 文件中添加如下配置: ```xml <dependency> <groupId><your-group-id></groupId> <artifactId><your-artifact-id></artifactId> <version><your-version></version> <scope>compile</scope> </dependency> ``` 将上述占位符替换为实际值后保存文件。此过程使得 Maven 能够感知新加入的依赖关系,并将其纳入构建流程之中[^2]。 3. **解决打包问题** 当采用某些特定类型的插件(如 Spring Boot 或 Assembly 插件)进行最终产物生成时,可能会遇到 system scope 类型未被打包的情况。针对这种情况可采取相应措施调整配置参数以满足需求。例如对于 spring-boot-maven-plugin ,需增加额外属性设置允许包含此类特殊依赖: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <includeSystemScope>true</includeSystemScope> </configuration> </plugin> </plugins> </build> ``` 对于其他形式则参照具体文档指导完成定制化改造工作[^3]。 4. **验证与测试** 经过以上步骤之后重新编译整个工程确认无误后再尝试导出独立运行体 (fat jar etc.) 并放置预期位置供后续利用[^4]。 --- ### 注意事项 - 确保所使用的 IDE 版本支持最新版 Maven 功能特性。 - 若涉及多模块复杂结构,则还需注意父子 POM 关联以及继承机制可能带来的影响。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值