maven插件与maven-publish插件的区别

maven插件适用于gradle1.0-6.2版本,6.2版本后该插件就被废弃了,推荐使用maven-publish插件。
maven-publis插件是在gradle 1.3 版本后开始支持的,使配置更加简洁。

maven-publis插件的使用

砍柴不误磨刀工,我们先来看一下官方文档。

The Maven Publish Plugin

下面配置展示如何签署和发布 Java 库,包括源代码、Javadoc 和自定义 POM:

plugins {
    id 'java-library'
    id 'maven-publish'
    id 'signing'
group = 'com.example'
version = '1.0'
java {
    withJavadocJar()
    withSourcesJar()
publishing {
    publications {
        mavenJava(MavenPublication) {
            artifactId = 'my-library'
            //若是war包,就写components.web,若是jar包,就写components.java 
            from components.java
            versionMapping {
                usage('java-api') {
                    fromResolutionOf('runtimeClasspath')
                usage('java-runtime') {
                    fromResolutionResult()
            pom {
                name = 'My Library'
                description = 'A concise description of my library'
                url = 'http://www.example.com/library'
                properties = [
                    myProp: "value",
                    "prop.with.dots": "anotherValue"
                licenses {
                    license {
                        name = 'The Apache License, Version 2.0'
                        url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                developers {
                    developer {
                        id = 'johnd'
                        name = 'John Doe'
                        email = 'john.doe@example.com'
                scm {
                    connection = 'scm:git:git://example.com/my-library.git'
                    developerConnection = 'scm:git:ssh://example.com/my-library.git'
                    url = 'http://example.com/my-library/'
    repositories {
        maven {
            // change URLs to point to your repos, e.g. http://my.org/repo
            def releasesRepoUrl = layout.buildDirectory.dir('repos/releases')
            def snapshotsRepoUrl = layout.buildDirectory.dir('repos/snapshots')
            url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
signing {
    sign publishing.publications.mavenJava
javadoc {
    if(JavaVersion.current().isJava9Compatible()) {
        options.addBooleanOption('html5', true)
   

结果将发布以下工件:

  • POM:my-library-1.0.pom

  • Java 组件的主要 JAR 工件:my-library-1.0.jar

  • 已显式配置的源 JAR 工件:my-library-1.0-sources.jar

  • 已显式配置的 Javadoc JAR 工件:my-library-1.0-javadoc.jar

签名插件用于为每个工件生成签名文件。此外,将为所有工件和签名文件生成校验和文件。

publishToMavenLocal` 不会在$USER_HOME/.m2/repository.如果您想验证校验和文件是否已正确创建,或将其用于以后发布,请考虑使用 URL 配置自定义 Maven 存储库file://并将其用作发布目标。

from components.java

若是war包,就写components.web,若是jar包,就写components.java

如果发布的产物没有jar包就是缺少这个配置

//gradle 官方文档:https://docs.gradle.org/current/userguide/publishing_maven.html#publishing_maven:complete_example publishing { publications { mavenJava(MavenPublication) { artifactId = 'serviceloader' //若是war包,就写components.web,若是jar包,就写components.java from components.java versionMapping { usage('java-api') { fromResolutionOf('runtimeClasspath') usage('java-runtime') { fromResolutionResult() pom { name = 'serviceloader library' description = 'A concise description of my library' url = 'http://www.baidu.com/library' properties = [ myProp: "value", "prop.with.dots": "anotherValue" licenses { license { name = 'The Apache License, Version 2.0' url = 'http://www.apache.org/licenses/LICENSE-2.0.txt' developers { developer { id = 'johnd' name = 'John Doe' email = 'john.doe@example.com' scm { connection = 'scm:git:git://example.com/my-library.git' developerConnection = 'scm:git:ssh://example.com/my-library.git' url = 'http://baidu.com/my-library/' repositories { maven { url = uri('../repo') println("maven url $url")

从上图可以看出生成了doc文件和source文件,是因为下面的配置:

java {
    withJavadocJar()
    withSourcesJar()

maven-publish可以用的配置

一、下面是精简后的配置(基于官方推荐版本):
group = 'cn.rock.spi'
version = '0.0.1'
publishing {
    publications {
        mavenJava(MavenPublication) {
            artifactId = 'serviceloader'
            from components.java
    repositories {
        maven {
            url = uri('../repo')

这个时候,点击下Sync同步下代码,然后可以在右侧GradleTab中,找到publishing,里面有publish选项,我们双击它,就开始执行发布插件的操作了。

如果你的Android Studio 在配置后没有publishing的task,参考下面方法。

解决方案(Mac)
点击Android Studio–>Preference–>选择Experimental(实验性选项)–>在Gradle一栏中取消勾选"Do not build Gradle task list during Gradle sync"

或者勾选下面的选项

点击File–>Sync Project with Gradle Files即可

第二种配置

如果你比较喜欢恋旧,下面的配置也是可以的。

afterEvaluate {
    publishing {
        //配置maven-publishing插件的输出物
        publications {
            mavenJava(MavenPublication) {
                groupId = 'cn.rock.spi'
                artifactId = 'serviceloader'
                version = '0.0.1'
                from components.java
        repositories {
            maven {
                url = uri('../repo')
 

使用mavenJava(MavenPublication)

dependencies { implementation 'cn.rock.spi:serviceloader:0.0.1'

完整demo:

https://github.com/jdsjlzx/spi

GitHub - jdsjlzx/NewSpi: Android中SPI思想应用与改进

其他版本一:

apply plugin: 'com.android.library'
apply plugin: 'maven-publish'
apply plugin: 'digital.wup.android-maven-publish'
android {
    compileSdkVersion "33" as int
    defaultConfig {
        ......
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles 'consumer-rules.pro'
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
dependencies {
def VERSION = "0.9.3.3"
def GROUP_ID = "com.baidu.sdk"
def ARTIFACT_ID = "ARTIFACT_ID"
def MAVEN_USERNAME = "username"
def MAVEN_PASSWORD = "123456"
def MAVEN_URL = "http://www.baidu.com"
afterEvaluate {
    publishing {
//    配置maven-publishing插件的输出物
        publications {
            maven(MavenPublication) {
                afterEvaluate { artifact(tasks.getByName("bundleReleaseAar"))}
                groupId = GROUP_ID
                artifactId = ARTIFACT_ID
                version = VERSION
        repositories {
            maven {
                credentials {
                    username MAVEN_USERNAME
                    password MAVEN_PASSWORD
                url = MAVEN_URL

其他版本二:

apply plugin: 'maven-publish'
ext {
    GROUP_ID = "com.baidu.group"
    ARTIFACT_ID = "im-sdk"
    VERSION_NAME = "0.0.1"
//声明变量记录上传Maven库地址
def repositoryUrl
//判断发到正式库还是snapshot库
if (isReleaseBuild()) {
    //上传Release私有仓库
    repositoryUrl = "https://baidu.com/"
} else {
    println 'SNAPSHOT Versions'
    //上传snapshot私有仓库
    repositoryUrl = "http://baidu.com/debug/"
//从项目gradle.properties中读取Nexus服务器登录用户名
def getRepositoryUserName() {
//    return hasProperty('USERNAME') ? USERNAME : ""
    return "autoai-AVS"
//读取Nexus服务器登录密码
def getRepositoryPassword() {
//    return hasProperty('PASSWORD') ? PASSWORD : ""
    return "@pIbl9kE"
def isReleaseBuild() {
    return !VERSION_NAME.contains("SNAPSHOT")
afterEvaluate {
    task generateSourcesJar(type: Jar) {
        from android.sourceSets.main.java.srcDirs
        classifier 'sources'
    publishing {
        publications {
            release(MavenPublication) {
                if (project.getPlugins().hasPlugin('com.android.application') ||
                        project.getPlugins().hasPlugin('com.android.library'))
                    from(components.release)
                    from(components.java)
                pom {
                    groupId = GROUP_ID
                    version = VERSION_NAME
                    artifactId = ARTIFACT_ID
                artifact generateSourcesJar
        repositories {
            maven {
                credentials {
                    username getRepositoryUserName()
                    password getRepositoryPassword()
                url repositoryUrl
                    maven插件适用于gradle1.0-6.2版本,6.2版本后该插件就被废弃了,推荐使用maven-publish插件。如果你的Android Studio 在配置后没有publishing的task,可以尝试clean下重新build。如果还是不行,不要怀疑配置有问题,mac电脑有时候会出现这种问题,换window电脑马上就有这个task了。下面是我项目中 使用的配置,当然pom的配置你可以继续跟进需要进行删减。选项,我们双击它,就开始执行发布插件的操作了。如果你比较喜欢恋旧,下面的配置也是可以的。
				
一、maven-publish介绍   在 Gradle 1.3 中,引入了一种新的发布机制。这种新机制引入了一些新概念和功能,这些功能使 Gradle 发布变得更加强大,现在已成为发布工件的首选选项。 二、maven-publish使用 1、在build.gradle 声明插件 plugins { id 'maven-publish' 2、使用publishing{}块进行配置 group = 'org.example' version = '1.0' publishing.
平时开发中会把一些独立的功能模块抽取出来作为sdk,既方便业务接入,又能让其他业务线快速复用。那么我们就需要将sdk打包上传到maven仓库,让业务侧依赖即可。在上传产物到maven仓库之前,我们的知道产物到底是什么。Android Gradle插件根据项目gradle中应用不同的插件类型在编译组装后会生成不同的产物:Android项目的主工程app的gradle配置文件依赖: 因此,在通过编译命令 或后,就会在build/outputs/apk文件下生成产物:如图,apk就是产物(构件)。如果是海外市场,
一、升级 JDK(可跳过阅读) 1.1 自己下载 因为 Gradle 7.0 以上需要 JDK 11 环境, 所以需要升级一下 JDK, 但这里要注意一点, 使用 OpenJDK。 我一开始去官网下载 JDK 11, 后来朋友提醒 JDK 8 以后要收费, 查了一堆资料, 最后发现还是 OpenJDK 安全一点, 点击 这里 进入 OpenJDK 官网。
AndroidStudio使用maven-publish发布aarmavencentral中央仓库 1. 注册【sonatype】账号 2. 创建Group ID 3. 下载安装gnupg 4. 创建生成密钥 5. 配置maven-publish打包推送aar 6. 发布mavencen
m-publish是一个Gradle插件,用于将本地library发布到Apache Maven仓库。通过使用插件,我们可以将*.aar、*.jar等library发布仓库中,并通过gradle或者maven进行远程依赖使用。 要使用maven-publish插件,需要在build.gradle中声明插件,并在publishing{}块中进行配置。首先,通过在plugins{}块中添加id 'maven-publish'来声明插件。然后,在publishing{}块中,可以配置group和version属性,以及定义要发布的publication和repository。 例如,通过components.java来指定要发布的library,使用mavenLocal()来指定要发布到的仓库。可以根据需要添加更多的publication和repository配置。 maven-publish插件提供了一些任务,如generatePomFileForPubNamePublication用于创建需要发布的POM文件,并填充一些已知的元数据,例如项目名称、项目版本和依赖项。publishPubNamePublicationToRepoNameRepository用于将指定publication发布到指定repository。publishPubNamePublicationToMavenLocal用于将指定publication发布复制到本地Maven缓存,包括POM文件和其他元数据。 此外,还有一些其他任务,如publish将所有定义的publication发布到所有定义的存储库的聚合任务,而publishToMavenLocal将所有定义的publication复制到本地Maven库中,包括它们的元数据。 例如,如果我们有一个名为myLibrary的publication,并将其发布mavenLocal()仓库,我们可以运行命令publishPubNamePublicationToMavenLocal来实现。 linc365: from components.java 报错 Could not get unknown property 'java' for SoftwareComponentInternal set of type org.gradle.api.internal.component.DefaultSoftwareComponentContainer. 不管我换成“components.java”还是“components.web”还是components.release,都报错,这可怎么办啊,照着官方文档都能报错 理解AQS的原理及应用总结 Yocn: 这篇真的是太牛了