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
同步下代码,然后可以在右侧Gradle
的Tab
中,找到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发布aar至mavencentral中央仓库
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。
publishPubNamePublicationTo
MavenLocal用于将指定publication
发布复制到本地
Maven缓存,包括POM文件和其他元数据。
此外,还有一些其他任务,如
publish将所有定义的publication
发布到所有定义的存储库的聚合任务,而
publishTo
MavenLocal将所有定义的publication复制到本地
Maven库中,包括它们的元数据。
例如,如果我们有一个名为myLibrary的publication,并将其
发布到
mavenLocal()
仓库,我们可以运行命令
publishPubNamePublicationTo
MavenLocal来实现。
linc365:
理解AQS的原理及应用总结
Yocn: