记录maven转gradle时去连接中央仓库的问题

    科技2025-09-13  32

    背景

    gradle听到的越来越多,spring5的源码都在使用了,先用maven转gradle试试水。

    gradle安装

    网上教程不少,大体上就是 下载 -> 解压 ->配置环境变量 -> 测试over 环境变量粘一下

    GRADLE_HOME:F:\gradle\gradle-6.6.1 GRADLE_USER_HOME:F:\gradle\.gradle

    GRADLE_HOME是解压后文件位置 GRADLE_USER_HOME是后面下载缓存的问题,不配置的话会跑到C盘用户下

    尝试maven转gradle

    1、网上查到的资料简单粗暴,直接在pom.xml所在路径下执行gradle init就OK。 这里会自动识别类型,判断为maven后会有提示,输入yes继续执行。 也可以直接指定类型gradle init --type pom 我在这里出的错,总是去连接maven中央仓库,然后就失败了。

    思路1:改路径嘛,换成阿里云的仓库。 写个init.gradle丢到.gradle目录下

    allprojects { repositories { mavenLocal() maven { url "http://maven.aliyun.com/nexus/content/groups/public/" } } }

    再次执行gradle init --type pom,失败! 再次执行gradle --init-script ..\..\.gradle\init.gradle init --type pom,失败! 再次执行gradle --init-script ..\..\.gradle\init.gradle init --type pom --debug,失败!还是连接maven中央库

    思路2:init.gradle不生效?试一下参数变了没。 参照官网输出一下maven地址 创建一个build.gradle,扔到外边

    repositories { } task showRepos { doLast { println "All repos:" println repositories.collect { it.name } println repositories.collect { it.url } } }

    打开CMD,进入build.gradle目录下,运行gradle --init-script .gradle\init.gradle -q showRepos

    All repos: [MavenLocal, maven, MavenLocal2, maven2] [file:/C:/Users/admin/.m2/repository/, http://maven.aliyun.com/nexus/conten t/groups/public/, file:/C:/Users/admin/.m2/repository/, http://maven.aliyun .com/nexus/content/groups/public/]

    可见init.gradle已生效。maven本地仓库地址不对。

    思路3:maven已经把jar包都下载过了,把本地路径改正确就不会去中央仓库了吧。 查看官网mavenLocal的加载顺序

    1、系统属性'maven.repo.local'的值(如果已设置); 2、如果~/.m2/settings.xml该文件存在并且已设置元素<localRepository>,则为元素<localRepository>的值; 3、如果$M2_HOME/conf/settings.xml此文件存在并且设置了元素<localRepository>,则为元素<localRepository>的值(其中$M2_HOME是具有该名称的环境变量的值); 4、路径~/.m2/repository。

    增加M2_HOME环境变量,值设为正在使用maven路径,保证其内部的setting.xml正确。 重新打开命令窗,进入build.gradle目录下,再次执行gradle --init-script .gradle\init.gradle -q showRepos

    All repos: [MavenLocal, maven, MavenLocal2, maven2] [file:/F:/maven/maven_repository/, http://maven.aliyun.com/nexus/content/groups/ public/, file:/F:/maven/maven_repository/, http://maven.aliyun.com/nexus/content /groups/public/]

    mavenLocal正确

    到项目路径下再次执行gradle init --type pom --debug 项目转化成功,并自动生成build.gradle文件 通过debug日志发现,这次执行并没有经过maven远程仓库。 打开生成的build.gradle

    /* * This file was generated by the Gradle 'init' task. */ allprojects { group = 'com.*****.****' version = '1.0-SNAPSHOT' } subprojects { apply plugin: 'java' apply plugin: 'maven-publish' repositories { mavenLocal() maven { url = uri('http://repo.maven.apache.org/maven2') } } dependencies { implementation 'org.springframework.boot:spring-boot-starter-actuator:2.3.0.RELEASE' implementation 'org.springframework.boot:spring-boot-starter-aop:2.3.0.RELEASE' implementation 'cn.hutool:hutool-all:4.5.7' implementation 'org.projectlombok:lombok:1.18.12' implementation 'org.springframework.boot:spring-boot-configuration-processor:2.3.0.RELEASE' testImplementation 'org.springframework.boot:spring-boot-starter-test:2.3.0.RELEASE' } sourceCompatibility = '1.8' publishing { publications { maven(MavenPublication) { from(components.java) } } } tasks.withType(JavaCompile) { options.encoding = 'UTF-8' } }

    可见其中的maven地址还是指向中央仓库

    repositories { mavenLocal() maven { url = uri('http://repo.maven.apache.org/maven2') } }

    应该是自动生成默认这个地址,暂时还未找到从哪里修改,不过通过本地仓库转换是没问题了。

    注意: 修改环境变量后,IDEA中的命令窗口是需要重启idea才能生效的。

    问题2:init.gradle替换中央仓库不生效

    网上复制的配置

    allprojects{ repositories { def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/' all { ArtifactRepository repo -> if(repo instanceof MavenArtifactRepository){ def url = repo.url.toString() if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) { project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL." remove repo } } } maven { url REPOSITORY_URL } } }

    需要注意中央仓库地址是否一致,网上的例子为https://repo1.maven.org/maven2 而在gradle6.6.1中,mavenCentral()中地址为https://repo.maven.apache.org/maven2/ 此处对应不上同样不会生效。

    Processed: 0.009, SQL: 8