Maven - 在没有网络的情况下强制使用本地jar包

文章目录


问题

非互联网环境,无法从中央仓库or镜像里拉取jar包。 服务器上搭建了一套Nexus私服。

Nexus私服故障,无法连接。

工程里新增了一个Jar的依赖, 本地仓库和伺服里都有这个版本的Jar.

奈何默认情况下, IDEA依然从Nexus拉取,导致会产生一个lastUpdated文件,IDEA认为没有拉取下来,工程编译不过


解决思路

在非互联网环境中,如果 Nexus 私服无法连接,而本地仓库和服务器上已经有了所需的 JAR 依赖,可以通过删除本地仓库中的 _remote.repositories 文件,强制 Maven 使用本地仓库中的依赖。


解决办法

删除 _remote.repositories 文件

  1. 找到本地仓库中的 _remote.repositories 文件

    默认情况下,本地 Maven 仓库路径为 ~/.m2/repository。在该目录下找到相关依赖的目录,里面可能包含 _remote.repositories 文件。

  2. 删除 _remote.repositories 文件

    删除对应依赖目录中的 _remote.repositories 文件。例如,对于 com.example:example-dependency:1.0.0 依赖,路径可能类似于:

    复制代码
    ~/.m2/repository/com/example/example-dependency/1.0.0/_remote.repositories
  3. 刷新 Maven 依赖

    在 IntelliJ IDEA 中,右键点击项目的 pom.xml 文件,然后选择 Maven > Reimport。或者点击 Maven 工具窗口中的刷新按钮。

代码

写了个Java 方法,用于自动删除本地 Maven 仓库中所有 _remote.repositories 文件:

java 复制代码
import java.io.File;

public class CleanLocalMavenRepo {
    public static void main(String[] args) {
        File mavenLocalRepo = new File(System.getProperty("user.home"), ".m2/repository");
        // File mavenLocalRepo = new File("D:\\xxx\\repository2")
        clean(mavenLocalRepo);
    }

  /**
 * 递归清理本地 Maven 仓库,删除所有 "_remote.repositories" 文件。
 *
 * @param file 要清理的文件或目录。
 */
	private static void clean(File file) {
	    // 检查给定的文件是否是一个目录
	    if (file.isDirectory()) {
	        // 遍历目录中的所有文件和子目录
	        for (File f : file.listFiles()) {
	            // 对每个文件或子目录递归调用 clean 方法
	            clean(f);
	        }
	    } else if (file.getName().equals("_remote.repositories")) {
	        // 如果文件名为 "_remote.repositories"
	        // 打印要删除的文件的绝对路径
	        System.out.println("Deleting: " + file.getAbsolutePath());
	        // 删除该文件
	        file.delete();
	    }
	}

}

手动操作步骤

  1. 导航到本地仓库目录

    sh 复制代码
    cd ~/.m2/repository
  2. 查找并删除 _remote.repositories 文件

    使用以下命令查找并删除所有 _remote.repositories 文件:

    sh 复制代码
    find . -name "_remote.repositories" -exec rm -f {} \;

在 Windows 中,可以使用以下命令来查找并删除所有 _remote.repositories 文件:

bash 复制代码
del /s /q "_remote.repositories" >nul 2>&1
  • del 命令用于删除文件。
  • /s 参数指示命令在当前目录及其所有子目录中搜索文件。
  • /q 参数启用安静模式,即删除文件时不提示确认。
  • "*.txt" 指定要删除的文件名模式。在本例中,它将匹配所有名为 _remote.repositories 的文件。
  • >nul 2>&1 将命令的输出重定向到空设备,从而隐藏任何输出信息。

请注意 : 在执行此命令之前,请确保你位于正确的目录(~/.m2/repository),因为此命令将删除所有匹配的文件,并且无法恢复。

验证

删除 _remote.repositories 文件后,重新加载 Maven 依赖,确认 IDEA 不再尝试从 Nexus 私服拉取依赖,并成功使用本地仓库中的 JAR 文件。

相关推荐
皮卡蛋炒饭.9 小时前
线程的概念和控制
java·开发语言·jvm
一只大袋鼠9 小时前
MyBatis 入门详细实战教程(一):从环境搭建到查询运行
java·开发语言·数据库·mysql·mybatis
程序员老邢9 小时前
【人生底稿・番外篇 05】我的电影江湖:从录像带时代,到港片陪伴的青春岁月
java·程序人生·职场发展·娱乐
sonnet-10299 小时前
函数式接口和方法引用
java·开发语言·笔记
Bat U9 小时前
JavaEE|多线程(二)
java·开发语言
_Evan_Yao9 小时前
RAG中的“Chunk”艺术:我试过10种切分策略后总结的结论
java·人工智能·后端·python·软件工程
魂梦翩跹如雨10 小时前
数据库的“契约” —— 约束(Constrains)
java·数据库·mysql
独自破碎E10 小时前
面试官:你有用过Java的流式吗?比如说一个列表.stream这种,然后以流式去处理数据。
java·开发语言
2601_9498180911 小时前
头歌答案--爬虫实战
java·前端·爬虫
2601_9498179211 小时前
大厂Java进阶面试解析笔记文档
java·笔记·面试