maven项目从外网搬迁至内网-本地仓库(不搭建私服)

问题描述

由于安全问题,有的项目需要在内网开发(无法连接外网),因此无法下载相关的 maven 依赖,导致项目无法编译启动。这个很多开发都遇到过,特别是涉及政务、军队的项目,安全级别高,都是专网开发的。

以前我们项目都是在内网搭建maven私服的,使用起来更加规范,特别适合团队协作开发。

在内网搭建 Maven 私服来解决这个问题,参考:

使用Nexus搭建Maven私服教程(附:配置并使用私服教程):

https://www.hangge.com/blog/cache/detail_2844.html

如果觉得搭建私服麻烦的话,或者暂时没有条件或环境的,还有更简单的方法,就是直接将在外网下载好的 maven 依赖拷贝到内网使用。目前接手的一个证券项目就是这个情况,网上资料很多,比较杂乱,没有很详尽的。我照着做,各种问题解决,花了不少功夫才搞定。

现在趁热把实践的最优路径和注意事项整理分享给大家。

迁移步骤

(1)仓库打包(外网)

首先将相关的 maven 依赖在外网的环境中下载好,然后将整个 repository 打包后拷贝到内网的机器上并解压:

最好是选择新的maven仓库地址,重新构建,这样没有冗余的其他项目的包,文件小方便传输。

(2)settings 文件配置(内网)

bash 复制代码
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0
          http://maven.apache.org/xsd/settings-1.2.0.xsd">

  <!--这里只写一个本地仓库路径!统一用 D:/software/apache-maven-3.9.16/repository -->
  <localRepository>D:/software/apache-maven-3.9.16/repository</localRepository>

  <mirrors>
    <!--全部镜像删掉!一个都不要留-->
  </mirrors>

  <profiles>
    <!--所有 profile 全部清空,不要任何 repositories /   pluginRepositories -->
  </profiles>

  <activeProfiles>
  </activeProfiles>

</settings>

网上说,可以将外网的 settings 文件也拷贝到内网使用,或者也可以将内网 settings 文件中的镜像配置部分改成和外网一样。如果是自己迁移没有问题,如果依赖仓库来自别人配置起来就比较复杂。

(3)仓库文件处理(内网)

在内网解压repo.zip,确认整个仓库把 _remote.repositories、*.lastUpdated 删除干净。

打开 cmd,进入仓库根目录:

cmd

bash 复制代码
cd D:\software\apache-maven-3.9.16\repo
del /s _remote.repositories
del /s *.lastUpdated

如果是Maven 3.9.x,还需要删除所有的:maven-metadata*.xml。

del /s maven-metadata*.xml

也可以使用文件管理器的搜索功能,全选搜索项,右键删除。

然后在文件夹右上角搜索,**确认一个都搜不到,**只要还有一个残留Maven 就可能触发来源校验编译不过。

(4)父 pom 必须写死全部插件版本

即使前面都修好,离线模式下 Maven 不会自动解析插件版本 ,父 pom 里 pluginManagement 必须写死:

bash 复制代码
<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.4.0</version>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.11.0</version>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.2.5</version>
        </plugin>
    </plugins>
</pluginManagement>

子模块引用插件时不用写 version。

注意这里的插件对应的版本version,必须是仓库里面已经有的。如果version不对,可能编译报错(依赖包不存在,不同的插件对应的子依赖版本不一样),这个时候最优解是调整version版本,而不是去下载新的依赖。

(5)在IDEA配置Maven

最后打开 IDEA 的 Maven 设置,配置好本地仓库地址和 settings 文件地址,并勾选上 Work offline (离线模式),这样就完成 Maven 的离线配置了。

如果编译报错,找不到原因。可以在命令行执行,排除 IDEA 缓存干扰:

cmd

mvn clean compile -o

-o 代表离线。

如果命令行能跑通、IDEA 不行 → 一定是 IDEA 里 settings 没选对或者缓存没清干净。

(6)刷新maven仓库配置

如果还不行可以点击 reimport 按钮刷新一下 maven 的依赖,然后依赖就可以导入进来了。

我是加贝哥,十八年IT老兵,「猿in」GZH主理人, 「开源AI知识库」作者,前G厂程序员/架构/产研经理,AI进化派,一线OPC创业者。

我的「OPC成长知识库」,主要分享自媒体/IP学习总结,实践心得,以及一人公司(OPC)内容库运营相关经验,伙伴儿们可以免费关注订阅。

本文内容纯属干货,建议收藏备用。有相关需求的伙伴,可以参考这个迁移步骤。预祝,一次功成!

相关推荐
学长毕设5 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw6 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号7 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场7 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠7 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David8 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
外收内放8 小时前
Python基础语法练习题(73)
java·前端·python
Wang's Blog8 小时前
Java 项目实战: 交友项目 - 环信后台发送消息测试
java·交友
用户3721574261359 小时前
Java 操作 Word 脚注和尾注:添加、读取与删除
java
小嘉丶学长9 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节