需求背景
- 某银行项目采用封闭式开发,所有代码都运行在内网环境,不可连接互联网
- 此时,我们将一个标准的maven项目源代码拷贝进内网后,如何让其编译通过?
- 因为不能连接互联网的maven中央仓库,也可能不能连接阿里云maven仓库,许多开源依赖包都无法拉取到
- 当然还有可能该银行提供了自己的maven私服,但可能该私服上不存在你的项目所需的所有依赖或对应的版本
- 这个时候,可能有点手足无措
- 下面分享下个人的解决方案,欢迎大家指教
情况一:内网环境存在私有仓库,且私有仓库配置了中央仓库可连互联网
- 这种情况处理起来比较简单些
- 假设私有仓库可能设置了maven的国外镜像仓库或阿里云的镜像仓库
- 此时你项目中的绝大部分依赖都可以正常拉取到对应的版本过来
- 但是也存在一些特殊的依赖,比如你们公司自己开发的一些其他项目的jar,或者又是一些商业化的组件
- 这时,你需要做的就是将你的项目导入到idea后,并配置好maven及settings,右键maven刷新
- 视你的网速和项目大小,可能需要5到20分钟不等的时间,idea调用maven插件在下载大量依赖包
- 最终,你可能看到这么一份错误列表
- 而这里面列的,大概都是互联网仓库里找不到的依赖包了
- 此时,推荐你到maven私服上查询并确认下,这些依赖是否确实不存在
- 确认无误后,将这些jar包从互联网环境中拿到(这里有很多办法),然后上传到maven私服上,填写对相应的坐标
- 上传后,再次本地尝试打包,应该即可正常安装你的模块了
- 当然,如果你只想让自己本地可以编译通过,也可以将该包拷贝到你本地的私服目录
- 此时在你本地私服目录已经存在了这个依赖的目录了,但是下面没有jar文件
- 你只需要将对应的jar包拷贝到此目录下,再次打包即可
情况二:内网有自己的maven私服,但不能连接互联网
- 这种情况要麻烦许多,你同样用上面的idea中maven刷新的方式,找到所有找不到的依赖
- 这种情况有可能有非常多的jar包都找不到,因为内网私服即便是有对于类型的jar,也不一定版本能匹配上
- 找到这些jar包后,一个个手动通过maven私服,上传至私服仓库里
- 如果涉及到jar包比较多,这个过程需要耐心,切不可急于求成,盲目修改项目本身依赖,否则可能出现更糟糕的问题
- 这种情况下,只能说,传完后再次测试,少了哪些,就传哪些,可能要折腾不少次
- 当然,如果你只想让本地通过编译,也可以用情况一描述的方式,将jar包拷贝到本地私服对应目录,也可以解决本地问题
- 这里,有人说需要在idea的maven设置中,配置-DarchetypeCatalog=local/internal
- 经过我测试,配置与不配置都一样,只要你本地有这个jar,他就会以你本地目录存在的jar优先,不会去私服上拉
- 当然如果是那种标记为Snapshots版本的jar,肯能另说,具体要看你项目的pom中,是否配置了版本的更新机制了
情况三:内网环境没有私服,也不具备让你搭建私服的条件
- 这种情况是最糟糕的,相当于纯离线开发与编译
- 不过这也不难,有两个方案可选
- 第一种,看网上教程,idea为maven项目手动导入依赖包,这里推荐此文
- 第二种,从外网已可正常编译及运行的本地环境中,将整个本地私服的目录压缩,并拷贝到内网环境(内网的本地仓库,按原结构拷贝过来)
- 个人推荐用第二种方案,因为这样做还是保持了maven项目的基本特性
- 第二种方案如果你要测试的话,可以点击让项目切换到离线模式,你可以在外网环境中是否可以正常编译,随后再做本地仓库的迁移
- 这个方案还有个好处,就是后面开发过程中,需要增加其他依赖包时,可以像普通maven工程一样,添加好依赖,然后将jar包放在对应的本地仓库中即可
最后补充说明:
- 情况二要注意,因为缺少的是较多的包,有可能缺少了一些关键依赖的pom依赖
- 举个例子,假设你的spring-boot-starter-parent依赖拉取不到
- 这种情况下,将导致该pom下的各种间接依赖也找不到
- 此时,你必须从外网环境中将该pom文件也一并上传到私服上,否则整个项目的依赖也会不完整
- 所以,有时候缺少的依赖不一定是jar包本身,还有可能是一些packaging类型为pom的中间依赖文件
- 还有,如果你的项目是一个多模块依赖的项目,在存在内网私服的前提下,要把那些公共依赖包,deploy到私服上
- 这样做,一是为了团队间协作,二是为了可以在内网服务器构建发布时,CICD平台能够拉取到相关依赖