当前位置: 首页 > news >正文

Maven内网开发使用离线仓库

Maven内网开发使用离线仓库

离线或者内网环境开发与外网不通,中央仓库连不上,使用 Maven 管理项目会遇到很多问题。
比如:依赖包缺失,内网的Nexus私服的包老旧,很久没有维护,项目无法运行打包,第三方非公开的私人 Jar 包引入麻烦。

本文面向这几个问题,提出几个解决方法:

解决方法:

  • 把项目弄外网,打包好再传入;(× 都内网开发了保密要求不行,不耍小聪明)
  • 使用本地离线仓库,离线打包;(√ )
  • 先上传到内网Nexus私服,再使用;(√ )

具体操作:

1.离线仓库:

先说说离线仓库:
首先,在外网新建一个测试项目,把需要的 jar 包依赖坐标都写在 pom.xml 物料清单里,然后把依赖下载到本地仓库。

注意1:
默认本地仓库(比如:D:/maven/maven_repo)可能有历史项目曾用的 Jar 包,占用空间会非常大。可以在 IDEA 的设置搜索Maven,重写本地仓库路径(比如:D:/maven/demo_repo),这里面仅包含本项目用到的 Jar 包。

注意2
把 demo_repo 压缩成 zip 包,搞到内网后,解压在仓库根路径下直接搜索关键字:_remote/ lastUpdate,搜到的文件都删除掉,不然在内网还是去找远程仓库下载,影响打包。

最简单的方法,在本地仓库根目录搜索栏关键字删除:
搜到的文件ctrl+A全选,再delete删除。
命令方式:

# 打开仓库地址,输入cmd 打开命令行,执行下面语句
for /r %i in (_remote.repositories) do del %i
for /r %i in (lastUpdate) do del %i

内网操作
进入 Maven 的 conf 目录,复制 settings.xml 并重命名为 settings-offline.xml。修改 settings-offline.xml 文件,修改以下几处。

<!-- 本地仓库路径,因为现使用离线方式,可以注释掉 -->
<!-- <localRepository>D:/maven/maven_repo</localRepository> --><!-- 1. 找到 offline,设置离线模式,设置成 true  -->
<offline>true</offline><!-- 2. 找到镜像 mirrors,设置离线模式 Maven 的镜像为本地仓库 -->
<mirrors><mirror><id>local-repo</id><mirrorOf>*</mirrorOf><name>central</name><url>file://D:/maven/demo_repo</url></mirror>
</mirrors>

修改 Maven 的配置文件为 settings-offline.xml,重写本地仓库为 D:/maven/demo_repo,重启IDEA刷新即可。
在这里插入图片描述

2.上传到内网Nexus私服

Nexus私服搭建网络上有很多教程,这里就不罗嗦了。
拥有 Nexus 管理员账号密码。
在 Nexus 上新建一个仓库,比如:http://localhost:8081/repository/demo-releases/

Nexus 页面手动一个个上传,对于一两个SDK来说很方便,整个仓库就很麻烦了。Nexus没提供批量上传文件夹的操作。但是有单个上传接口,就可以写个脚本遍历本地仓库上传模拟批量上传。

该图来源于网络,见右下角水印
该图来源于网络,见右下角水印

把下面脚本 batch_upload_repo.sh 扔到本地仓库根目录,整个仓库再扔到服务器上,然后执行脚本;(Windows 上使用 git-bash 执行脚本上传也行)结构相对位置例如:D:\maven\demo_repo\com\oracle\ojdbc\ojdbc8\19.3.0.0D:\maven\demo_repo\batch_upload_repo.sh

sh mvnimport.sh -u yourusername -p yourpassword -r http://localhost:8081/repository/demo-releases/

上传完成后,刷新工程正常下载使用。

附批量上传脚本:

#!/bin/bash
# batch_upload_repo.sh,来源于网络
# copy and run this script to the root of the repository directory containing files
# this script attempts to exclude uploading itself explicitly so the script name is important
# Get command line params
while getopts ":r:u:p:" opt; docase $opt inr) REPO_URL="$OPTARG";;u) USERNAME="$OPTARG";;p) PASSWORD="$OPTARG";;esac
donefind . -type f -not -path './mvnimport\.sh*' -not -path '*/\.*' -not -path '*/\^archetype\-catalog\.xml*' -not -path '*/\^maven\-metadata\-local*\.xml' -not -path '*/\^maven\-metadata\-deployment*\.xml' | sed "s|^\./||" | xargs -I '{}' curl -u "$USERNAME:$PASSWORD" -X PUT -v -T {} ${REPO_URL}/{} ;
http://www.lryc.cn/news/227795.html

相关文章:

  • CSS特效007:绘制3D文字,类似PS效果
  • LLM 面试总结
  • acwing算法基础之数学知识--求小于等于n的所有质数
  • 安装和使用 nn-Meter
  • PHP原生类总结利用
  • C/C++满足条件的数累加 2021年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
  • zookeeper:服务器有几种状态?
  • 大数据-之LibrA数据库系统告警处理(ALM-12040 系统熵值不足)
  • HTML页面模拟了一个类似Excel的表格在线diy修改表格内容
  • Unity如何保存场景,如何导出工程文件/如何查看保存位置?【各版本通用】
  • 2023年第十六届山东省职业院校技能大赛中职组“网络安全”赛项规程
  • html菜单的基本制作
  • Spark Job优化
  • CSS花边001:无衬线字体和有衬线字体
  • nodejs+vue+python+PHP+微信小程序-安卓- 基于小程序的高校后勤管理系统-计算机毕业设计
  • Leetcode153. Find Minimum in Rotated Sorted Array
  • 为什么要用“交叉熵”做损失函数
  • 【Android】Android apk 逆向编译
  • 04-详解SpringBoot自动装配的原理,依赖属性配置的实现,源码分析
  • [100天算法】-不同路径 III(day 73)
  • 【c++随笔12】继承
  • Excel中使用数据验证、OFFSET实现自动更新式下拉选项
  • Android修行手册 - 可变参数中星号什么作用(冷知识)
  • Python与ArcGIS系列(三)视图缩放
  • [ASP]数据库编辑与管理V1.0
  • MyBatis Plus整合Redis实现分布式二级缓存
  • 如何帮助 3D CAD 设计师实现远程办公
  • 如何在 Idea 中修改文件的字符集(如:UTF-8)
  • 【C++】单例模式【两种实现方式】
  • php的api接口token简单实现