如何将Gradle的模块发布到Maven仓库(本地或远程)

如何将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的联系与区别

Maven命令

《Gradle In Action》

最后

最近工作996很忙,写博客都是用休息的时间写的. T_T

如果帮助到你了,点个赞吧,这对博主真的很重要~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值