1. 背景
在公司不常用的一台电脑上安装了一个Maven的私服仓库Nexus。公司的网络没有公网的IP,为了能够在外出差的时候也能够访问到公司部署的Maven私服,于是就使用内网穿透工具将私服的端口号映射到了公网上,这样无论是在公司还是在外出差都能随时随地的从仓库中拉取到依赖。
2. 痛点
内网穿透工具可以解决公网的问题,但是内网穿透的工具有着流量和带宽的限制。在外应急可以使用内网穿透,公司内部还是想直接使用IP来直接访问私服地址。这样就需要频繁的修改repositories仓库的地址。有时候还不是修改一个两个项目的事情,多的时候能修改五六个项目的仓库地址,回到公司又得一个个的修改过来,非常的麻烦。那么有没有一个简单的方法可以快速的解决呢?
3. 解决方法
build.gradle.kts脚本文件中还是直接配置maven私服的地址。利用Gradle生命周期函数,在初始化阶段将内网IP和内网穿透的域名做好对照关系。加载仓库的地址前首先判断内网IP是否可以访问通。
3.1 Gradle生命周期

初始化阶段(Intialization)
这一阶段的主要任务是确定项目,并生成 Gradle 项目对象模型 (Project Model)。此阶段并不执行任何具体的构建逻辑,而是准备好构建的项目结构,Gradle 会根据 settings.gradle.kts 文件来识别构建的项目和子项目(如果有多项目构建)。

配置阶段(Configuration)
这个阶段会下载所有的插件和脚本的依赖,并执行build.gradle.kts的脚本生成任务对象,配置整个任务图,也就是所有要执行的任务极其依赖关系

执行阶段(execution)
这一阶段是实际执行任务的阶段,Gradle会按照任务的依赖顺序执行任务,并且只会执行那些与构建目标相关的任务。执行任务时按照用户请求的任务顺序进行的,且会依赖关系树

3.2 脚本内容
在Gradle的安装目录下的init.d目录下新建init.gradle.kts文件
import java.net.InetAddress
fun isIpAccessible(ip: String): Boolean {
return try {
// 将IP地址转换为InetAddress对象
val address = InetAddress.getByName(ip)
// 使用ping方法检查IP是否可以访问
address.isReachable(5000) // 超时时间为5000毫秒
} catch (e: Exception) {
// 发生异常时,IP不可访问
false
}
}
fun RepositoryHandler.enableMirror() {
all {
if (this is MavenArtifactRepository) {
val originalUrl = this.url.toString()
if (originalUrl.indexOf("192.168.2.253") > 0) {
val isIpAccessible = isIpAccessible("192.168.2.253");
if (!isIpAccessible) {
urlMapping[originalUrl]?.let {
this.setUrl(it)
}
}
}
}
}
}
val urlMapping = mapOf(
"http://192.168.2.253:8081/nexus/repository/weaver-public/" to "https://maven.aliyun.com/repository/gradle-plugin"
)
gradle.allprojects {
buildscript {
repositories.enableMirror()
repositories {
maven {
setUrl("https://maven.aliyun.com/repository/gradle-plugin")
}
maven {
setUrl("https://plugins.gradle.org/m2/")
}
}
}
repositories.enableMirror()
repositories {
maven {
setUrl("https://maven.aliyun.com/repository/public")
}
mavenCentral()
}
}
gradle.beforeSettings {
pluginManagement.repositories.enableMirror();
dependencyResolutionManagement.repositories.enableMirror();
}
评论区