• 如何在 Maven 中通过本地路径使用 JAR 包依赖


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

    使用绝对路径导入 JAR 包

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

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

    <project xmlns=...>
       
        <dependencies>
            <dependency>
                <groupId>组 IDgroupId>
                <artifactId>工件 IDartifactId>
                <version>版本号version>
                <scope>systemscope>
                <systemPath>JAR 包本地绝对路径systemPath>
            dependency>
        dependencies>
        
    project>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    使用相对路径导入 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>组 IDgroupId>
                <artifactId>工件 IDartifactId>
                <version>版本号version>
                <scope>systemscope>
                <systemPath>${project.basedir}/JAR 包对本 POM 文件的相对路径systemPath>
            dependency>
        dependencies>
        
    project>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在多模块中的情形

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

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

    <project xmlns=...>
       
        <dependencies>
            <dependency>
                <groupId>组 IDgroupId>
                <artifactId>工件 IDartifactId>
                <version>版本号version>
                <scope>systemscope>
                <systemPath>${project.basedir}/../JAR 包对根 POM 文件的相对路径systemPath>
            dependency>
        dependencies>
        
    project>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    【踩坑提醒】

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

    • 不要使用 ${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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    以软件定义物联网芯片,以技术融合推动LPWAN2.0泛在物联
    实践一个Vue 3 + TypeScript + Vite + Pinia项目
    《神经网络与深度学习》算法伪代码汇总
    .NET面试宝典130道经典面试真题及答案
    异构数据源同步之数据同步 → datax 改造,有点意思
    leetcode 第388场周赛第三题
    【力扣每日一题】2023.9.27 餐厅过滤器
    【1024程序员节专访】聚焦行业前沿,共话IT发展趋势
    Knockoutjs属性绑定(Bindings)之流程控制(Control flow)
    【探花交友】阿里云OSS、百度人脸识别
  • 原文地址:https://blog.csdn.net/wangpaiblog/article/details/127840334