gradle 打包发布到 maven 的 nexus 仓库

本贴最后更新于 1807 天前,其中的信息可能已经渤澥桑田

开头说两句

Java 基础 Demo 站: https://www.javastudy.cloud
Java 中高级开发博客: https://www.lixiang.red
Java 学习公众号: java 技术大本营
java_subscribe

前提背景

公司要封装一个工具类,把常用的 mybatis,apollo,redis,初始化运行检查等等都封装在一起,项目建好了,但是打包发布 nexus 之后,别的项目死活拉不到依赖包,经查,是 gradle 打包时生成的 pom 文件中没有加入模块依赖.

以前的解决方案及问题

以前公司用 gradle 打包的时候,先新建一个 maven_push.gradle ,然后在要打包的模块 build.gradle 中加上一句

apply from: '../maven_push.gradle'

maven_push.gradle 的内容如下:


// The Maven plugin adds support for deploying artifacts to Maven repositories.
// 一个可以让你把库上传到maven仓库的插件
apply plugin: 'maven'
// The signing plugin adds the ability to digitally sign built files and artifacts. These digital signatures can then be used to prove who built the artifact the signature is attached to as well as other information such as when the signature was generated.
// 对库文件进行数字签名的插件,可以通过签名知道谁创建了这个库文件,签名的时间等等信息
apply plugin: 'signing'

// 声明变量记录maven库地址
def mavenRepositoryUrl
// 判断是发布到正式库,还是snapshots库
if (isReleaseBuild()) {
    println 'RELEASE BUILD'
    // 下面的库地址指向的是我们私有仓库的Releases 仓库
    mavenRepositoryUrl = "http://xxx.com/repository/maven-public/"
} else {
    println 'SNAPSHOTS BUILD'
    // 下面的库地址指向的是我们私有仓库的snapshots 仓库
    mavenRepositoryUrl = "http://xxxx.com/repository/maven-snapshots/"
}

// 根据我们在likelib下gradle.properties中声明的版本名称,来分辨是Release版本还是 snapshots版本
def isReleaseBuild() {
    return !VERSION_NAME.contains("SNAPSHOT");
}

afterEvaluate { project ->
    // 我们声明我们要执行的上传到maven的task
    uploadArchives {
        repositories {
            mavenDeployer {
                beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
                // 我们类比下compile com.squareup.okhttp:okhttp:2.7.0
                // artifactId 对应com.squareup.okhttp; groupId 对应okhttp;version对应2.7.0
                // 这样就类似坐标的方式定位到了制定的库文件
                pom.artifactId = POM_ARTIFACT_ID
                pom.groupId = POM_GROUP_ID
                pom.version = VERSION_NAME

                // 授权验证,这里也就是你登陆搭建的私服服务器时候的用户名\密码
                repository(url: mavenRepositoryUrl) {
                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
                }
                // 这里是配置我们maven库需要的pom.xml文件的各个内容,具体意思我们在主目录gradle.properties中解释
                pom.project {
                    name POM_NAME
                    packaging POM_PACKAGING
                    description POM_DESCRIPTION
                    url POM_URL

                }
            }
        }
    }

    // 进行数字签名
    signing {
        required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
        sign configurations.archives
    }

}

这样是可以打包,但是对模块依赖就没办法打包,如 gradle 依赖配置如下:

dependencies {
	compile project(":tools-mybatis")
	compile project(":tools-ops")
}

但打包出来的 pom.xml 文件里面并没有这两个依赖.

新的打包方案

上述通过 maven 插件可能还有别的姿试可以打包,但是没有找到,通过查找官方文档,找到了以下解决方案
引入 maven-publish,这个 plugin , 然后在模块 build.gradle 中加入配置:

publishing {
	publications {
		maven(MavenPublication) {
			groupId = group
			artifactId = 'tools-starter'
			version = version
			from components.java
		}
	}
	repositories {

		maven { url "http://xxxx.com/repository/maven-snapshots/"
			credentials {
				username 'xxx'
				password 'xxxx'
			}
		}

	}
}

这样就可以通过 Idea 右边 gradle 工具栏的插件菜单来发布了
image.png
这样生成的 pom.xml 中是包含这两个依赖的.

参考文档

https://docs.gradle.org/current/userguide/publishing_maven.html#publishing_maven:tasks

  • Gradle
    41 引用 • 20 回帖 • 2 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 282 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...