内部仓库发布无需sonatype审核或gpg签名,只需正确配置maven-publish插件的repository url(必须以/结尾、无查询参数)、凭据(通过gradle.properties或环境变量安全加载)、publication绑定的component类型(android用androidcomponents,插件需gradleplugin块),并区分publishtomavenlocal(仅本地)与publish(真实上传)。

用 maven-publish 插件配置内部仓库地址就行
不需要 Sonatype 审核、不用 GPG 签名、不走 Central Portal,内部 Maven 仓库(比如 Nexus 或 Artifactory)只要提供 HTTP 地址和基础认证,就能直接发布。关键在于正确声明 publishing.repositories.maven 的 url 和凭据。
常见错误是把 url 写成带路径参数的地址(如 http://nexus:8081/repository/maven-releases/?v=1),这会导致 405 错误——Maven 仓库协议只接受标准仓库根路径,结尾不能带查询参数或斜杠后缀。
-
url必须以/结尾,且仅指向仓库实例下的具体 repository(如http://nexus:8081/repository/maven-releases/) - 快照和正式版建议分两个仓库,用
version.toString().endsWith("SNAPSHOT")动态切url - 如果仓库启用了匿名读取但要求写入认证,
credentials仍必须显式配置,否则publish任务会卡在 401
publishToMavenLocal 和 publish 别混用
publishToMavenLocal 是本地缓存($HOME/.m2/repository),它不走网络,也不校验 publishing.repositories 配置;而 publish 才真正上传到你定义的远程仓库。很多人跑完 publishToMavenLocal 就以为发成功了,结果别人 ./gradlew build 时拉不到——因为没真传过去。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 验证是否发到内部仓库:运行
./gradlew publish --info,看日志里有没有Uploading to http://... - 检查生成的 POM 是否完整:打开
build/publications/<pubname>/pom-default.xml</pubname>,确认<groupid></groupid>、<artifactid></artifactid>、<version></version>和你预期一致 - Android 项目注意:如果用了
com.android.library,默认 publication 是androidComponents,不是java,得显式调用from components.release或启用configureBasedOnAppliedPlugins()
认证凭据别硬编码在 build.gradle
把用户名密码写死在构建脚本里,既不安全又难维护。Gradle 支持从环境变量或 gradle.properties 加载,优先级高于脚本内联值。
- 推荐方式:在
~/.gradle/gradle.properties中加两行:nexusUsername=deployer、nexusPassword=xxx - 然后在
publishing { repositories { maven { ... credentials { username = project.findProperty("nexusUsername") ?: "" password = project.findProperty("nexusPassword") ?: "" } } } } - CI 环境下可直接设环境变量
ORG_GRADLE_PROJECT_nexusUsername,Gradle 会自动映射为 project property
插件元数据容易漏掉 gradlePlugin 块
普通 Java 库只需要 java component,但 Gradle 插件必须声明 gradlePlugin,否则生成的 POM 缺少 <plugin></plugin> 描述,下游项目 plugins { id "xxx" } 会报 Plugin [xxx] not found。
- 确保
build.gradle.kts启用了java-gradle-plugin插件 - 在
gradlePlugin { plugins { register("myPlugin") { id = "my.company.plugin" implementationClass = "MyPlugin" } } }中正确定义插件 ID 和入口类 - 发布后检查 jar 包内是否有
META-INF/gradle-plugins/my.company.plugin.properties,内容应为implementation-class=my.company.MyPlugin










