如何将Gradle的模块发布到Maven仓库(本地或远程)
1. 概述
在进行一个项目的模块化开发过程中,需要将一个模块作为外部的依赖,提供给别的项目使用,因为项目的构建工具使用的是Gradle,因此就有一个如何将Gradle的模块当作包安装到Maven仓库这样的一个问题。如果使用的是Maven来进行构建,那么只需要在开发完成项目之后install一下。发布模块是开发过程中重要的一个步骤,因此Gradle自然也提供了对应的插件,即maven-publish。本篇主要对这个插件进行了介绍,并给了对应的实例。gradle目前在国内的java web开发中还是比较少,但总的来说gradle是一个趋势,相比maven的xml,groovy的脚本灵活的多。
2. 详述
2.1 如果是maven
对于maven的命令,有这些常用的:mvn compile来编译项目、mvn package来打包项目、mvn test来测试、mvn install老装本地仓库、mvn deploy来部署到远程仓库、mvn site来生成项目的相关信息。若是maven,则只需要install就可以完成将项目打包安装本地仓库的过程。
2.2 gradle怎么弄
gradle要想发布到本地的maven仓库,那么是离不开插件的帮助的。
经过一番查找,在《Gradle in action》这本书中找到了,使用的就是“maven-publish”这个插件。
将其加入父工程的build.gradle:
subprojects {
apply plugin: 'java'
apply plugin: 'maven-publish'
}
这样每一个子模块就可以使用了。
增加maven-publish插件之后,就可以对发布的maven的pom文件组成,还有发布到的仓库进行配置了,其提供了:
publishing { // 配置你的发布
repositories { // 配置发布的仓库,有多个可选择
}
publications { // 配置发布的产出包,一个项目也有可能有多个产出,但大部分时候只有一个
}
}
以下是一个示例的配置:
publishing {
repositories {
maven {
name = 'localRepo'
url = "file://${buildDir}/repo"
}
}
publications {
myApp(MavenPublication) {
groupId = 'cn.hengyumo'
artifactId = 'my-app'
version = '0.0.1'
from components.java
}
}
}
这个配置会向gradle的task中增加两个任务:
- publishMyAppPublicationToLocalRepoRepository 这个任务会将myApp发布到我们指定的仓库位置(file://${buildDir}/repo),即工程的build目录下的repo目录下。
- publishMyAppPublicationToMavenLocal 这个任务会将myApp发布到电脑默认的用户maven仓库位置,一般会在用户目录下的.m2/repository下。
publishMyAppPublicationToLocalRepoRepository - Publishes Maven publication 'myApp' to Maven repository 'localRepo'.
publishMyAppPublicationToMavenLocal - Publishes Maven publication 'myApp' to the local Maven repository.
运行任务后就会进行打包、生成jar、pom,和各种签名文件,之后会复制到对应的仓库中,这里是我的一个模块中生成的结果;
其结构符合maven仓库的标准结构,不仅可以提供给maven使用还可以给gradle使用。
如果要上传到远程仓库,那么可以这样配置:
repositories {
maven {
name = "remoteRepo"
url = "http://my.org/repo"
}
}
同样会生成出对应的任务。publishMyAppPublicationToRemoteRepoRepository。
对应产出的maven 的pom结构,还可以进一步的配置:这是我的项目中的一个模块的publications配置,供大家参考
publications {
dawnCore(MavenPublication) {
groupId = 'cn.hengyumo'
artifactId = 'dawn-core'
version = '0.0.1'
from components.java
pom {
name = 'dawn-core'
description = 'dawn\'s core'
url = 'http://dawn.hengyumo.cn/core'
licenses {
license {
name = 'The Apache License, Version 2.0'
url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
developers {
developer {
id = 'hengyumo'
name = 'hengyumo'
email = 'le@hengyumo.cn'
}
}
}
}
生成的pom:可以看到我们配置的信息都进去了,依赖信息也生成的十分的工整
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- This module was also published with a richer model, Gradle metadata, -->
<!-- which should be used instead. Do not delete the following line which -->
<!-- is to indicate to Gradle or any Gradle module metadata file consumer -->
<!-- that they should prefer consuming it instead. -->
<!-- do_not_remove: published-with-gradle-metadata -->
<modelVersion>4.0.0</modelVersion>
<groupId>cn.hengyumo</groupId>
<artifactId>dawn-core</artifactId>
<version>0.0.1</version>
<name>dawn-core</name>
<description>dawn's core</description>
<url>http://dawn.hengyumo.cn/core</url>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<id>hengyumo</id>
<name>hengyumo</name>
<email>le@hengyumo.cn</email>
</developer>
</developers>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>cn.hengyumo</groupId>
<artifactId>dawn-utils</artifactId>
<version>0.0.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>ehcache-core</artifactId>
<groupId>net.sf.ehcache</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.wenhao</groupId>
<artifactId>jpa-spec</artifactId>
<version>3.2.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
3. 总结
Gradle还是很方便的。目前没有远程仓库可以实验,后续有机会再实验一下远程仓库——若需要密码的情况该如何配置。
4. 参考&引用
理解maven命令package、install、deploy的联系与区别
《Gradle In Action》
最后
最近工作996很忙,写博客都是用休息的时间写的. T_T
如果帮助到你了,点个赞吧,这对博主真的很重要~