文章目录

  • 使用绝对路径导入 JAR 包
  • 使用相对路径导入 JAR 包
  • 在多模块中的情形
  • 将 JAR 包安装到本地 Maven 仓库


  在 Maven 的 POM 文件中使用本地路径引入 JAR 包依赖通常都不是好主意,但是有时候会遇到极端的情况。一般在 Maven 中引入依赖需要这个依赖已经存在于 Maven 仓库中。这个 Maven 仓库可以是本地仓库,也可以是远程仓库。如果这个 JAR 包不在仓库中,且只是希望临时马上使用,或者需要将这个 JAR 包随 Maven 项目一起传给他人,这个时候使用本地路径引入 JAR 包依赖反而方便可靠一些。

使用绝对路径导入 JAR 包

  在 POM 文件加入如下配置即可。如果使用了多模块,建议将其放置在子 POM 中。其中,组 ID工件 ID版本号JAR 包本地绝对路径 可按需要任意填写。

  此时,这个 JAR 包就只能一直放到某个固定的位置,否则下次在 Maven 将无法找到此依赖。

<project xmlns=...>
   
    <dependencies>
        <dependency>
            <groupId>组 ID</groupId>
            <artifactId>工件 ID</artifactId>
            <version>版本号</version>
            <scope>system</scope>
            <systemPath>JAR 包本地绝对路径</systemPath>
        </dependency>
    </dependencies>
    
</project>

使用相对路径导入 JAR 包

  有时候需要将这个 JAR 包随 Maven 项目一起传给他人,这个时候就不能使用绝对路径。怎么办呢?这个问题麻烦一些。幸好,Maven 提供了一些内置属性。${project.basedir} 代表本 POM 文件所在的目录,所以如果将 JAR 包放到 POM 文件同目录下的其它文件夹(这个文件夹不妨叫 lib),那么这个 JAR 包的路径就可以在该 POM 路径中写成 ${project.basedir}/lib/XXX.jar

  其中,组 ID工件 ID版本号JAR 包相对路径 可按需要任意填写。

<project xmlns=...>
   
    <dependencies>
        <dependency>
            <groupId>组 ID</groupId>
            <artifactId>工件 ID</artifactId>
            <version>版本号</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/JAR 包对本 POM 文件的相对路径</systemPath>
        </dependency>
    </dependencies>
    
</project>

在多模块中的情形

  当遇到多模块时,这个问题会复杂一些。因为 ${project.basedir} 代表本 POM 文件所在的目录,所以如果在子 POM 使用这个代码,${project.basedir} 就会变成子 POM 所在的目录。幸好 Maven 允许 ../ 表示上一级目录。所以如果上面的 JAR 包位置不变,而在根模块的下一级的子模块引入依赖时,依赖代码如下。

  其中,组 ID工件 ID版本号JAR 包相对路径 可按需要任意填写。

<project xmlns=...>
   
    <dependencies>
        <dependency>
            <groupId>组 ID</groupId>
            <artifactId>工件 ID</artifactId>
            <version>版本号</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/../JAR 包对根 POM 文件的相对路径</systemPath>
        </dependency>
    </dependencies>
    
</project>

【踩坑提醒】

  • 只能在叶子模块中使用上述配置,不能在父模块进行此配置。原因是 Maven 依赖会自动发生继承效应。在父模块的依赖继承给子模块时,其 ${project.basedir} 值会发生变化,因此 <systemPath/...> 的值会改变。虽然子模块可以重写此依赖,从而可以覆盖父模块的负面效果,但如果子模块很多,维护起来会很麻烦。因此,不要在实际不需要使用此依赖的父模块的 <dependencies><dependencyManagement> 中引入该依赖。
  • 不要使用 ${project.parent.basedir}。该 Maven 内置属性在 Maven 2 中才有,Maven 3 中已废除。

将 JAR 包安装到本地 Maven 仓库

  决定该 JAR 包以后会长期使用时,可以选择将此 JAR 包安装进行本地 Maven 仓库了。这只需要在命令行输出如下命令即可。


【注意】

  • 该命令是一条命令,只不过为了美观而被拆分成了几行。
  • 该命令是 Windows CMD 模式下的命令。每行结尾的 ^ 是 CMD 下用于将一条命令内部换行而不间断。

mvn install:install-file ^
 -Dfile=JAR 包本地路径 ^
 -DgroupId=组 ID ^
 -DartifactId=工件 ID ^
 -Dversion=版本号 ^
 -Dpackaging=jar