最近在搞项目拆分,分层成库和技术库Maven 化,实际中遇到比较蛋疼的问题,记录下来以备后时只需;
1. Android Studio:
v3.1.2
2. Android-maven-gradle-plugin:
v2.0
3. Gradle Version:
v4.1
注意:
不同的版本对应关系,有不同的依赖问题,否则编译不通过哦;
具体细节,如图所示:
1. 配置工程目录下的project,build.gradle 脚本(注意,不是modules 下的build.gradle哦)
buildscript {
ext.kotlin_version = '1.1.51'
ext.android_plugin_version = '3.0.1'
ext.android_maven_gradle_plugin = '2.0'
repositories {
mavenCentral()
jcenter()
google()
maven { url 'http://localhost:8081/nexus/content/repositories/thirdparty' }
}
dependencies {
classpath "com.android.tools.build:gradle:$android_plugin_version"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "com.github.dcendents:android-maven-gradle-plugin:$android_maven_gradle_plugin"
}
}
allprojects {
repositories {
mavenCentral()
jcenter()
google()
maven { url 'http://localhost:8081/nexus/content/repositories/thirdparty' }
}
}
2. 配置modules 目录下(你将要上传到maven库的library),build.gradle 脚本
apply plugin: 'com.github.dcendents.android-maven'
task androidJavadocs(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
classifier = 'javadoc'
from androidJavadocs.destinationDir
}
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.srcDirs
}
tasks.withType(JavaCompile){
options.encoding = "UTF-8"
}
tasks.withType(Javadoc) {
options.encoding = "UTF-8"
}
artifacts {
archives androidSourcesJar
archives androidJavadocsJar
}
uploadArchives() {
repositories {
mavenDeployer {
repository(url: MAVEN_REPO_URL) {
authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
}
snapshotRepository(url: MAVEN_SNAPSHOT_REPO_URL) {
authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
}
pom.groupId = POM_GROUP_ID
pom.artifactId = POM_ARTIFACT_ID
pom.version = POM_VERSION
pom.project {
name POM_NAME
packaging POM_PACKAGING
description POM_DESCRIPTION
url POM_SITE_URL
scm {
url POM_SCM_URL
connection POM_SCM_CONNECTION
developerConnection POM_SCM_DEV_CONNECTION
}
licenses {
license {
name POM_LICENSE_NAME
url POM_LICENSE_URL
distribution POM_LICENSE_DISTRIBUTION
}
}
developers {
developer {
id POM_DEVELOPER_ID
name POM_DEVELOPER_NAME
}
}
}
}
}
}
如果遇到javadoc 编译不通过的情况,而此时的注释不符合规范的话,请使用如下脚本配置,
apply plugin: 'com.github.dcendents.android-maven'
task androidJavadocs(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
task androidJavadocs(type: Javadoc) {
options.encoding "UTF-8"
options.charSet 'UTF-8'
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
options.links("http://docs.oracle.com/javase/7/docs/api/");
options.linksOffline "http://d.android.com/reference", "${android.sdkDirectory}/docs/reference"
exclude '**/BuildConfig.java'
exclude '**/R.java'
failOnError = false
}
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.srcDirs
}
tasks.withType(JavaCompile){
options.encoding = "UTF-8"
}
artifacts {
archives androidSourcesJar
archives androidJavadocsJar
}
uploadArchives() {
repositories {
mavenDeployer {
repository(url: MAVEN_REPO_URL) {
authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
}
snapshotRepository(url: MAVEN_SNAPSHOT_REPO_URL) {
authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
}
pom.groupId = POM_GROUP_ID
pom.artifactId = POM_ARTIFACT_ID
pom.version = POM_VERSION
pom.project {
name POM_NAME
packaging POM_PACKAGING
description POM_DESCRIPTION
url POM_SITE_URL
scm {
url POM_SCM_URL
connection POM_SCM_CONNECTION
developerConnection POM_SCM_DEV_CONNECTION
}
licenses {
license {
name POM_LICENSE_NAME
url POM_LICENSE_URL
distribution POM_LICENSE_DISTRIBUTION
}
}
developers {
developer {
id POM_DEVELOPER_ID
name POM_DEVELOPER_NAME
}
}
}
}
}
}
3. 配置上传到maven repo 前所需的配置项,如下所示:
备注:
请在准备要上传的modules 中gradle.properties 中配置,如果没有请新建gradle.properties 文件
##############################################################################
# 基础,描述信息
# 包格式
POM_PACKAGING=aar
# 包名称
POM_NAME=library
# 组名称
POM_GROUP_ID=com.xxx
# 模块名称
POM_ARTIFACT_ID=library
# 版本名称,POM_VERSION 后面加-SNAPSHOT表示发布的是版本快照
POM_VERSION=0.0.1
##############################################################################
# 项目,描述信息
POM_DESCRIPTION=the android describe library.
POM_SITE_URL=http://git.xxx/xxx.git
POM_SCM_URL=http://git.xxx/xxx.git
[email protected]/[email protected]/xxx.git
# 项目,托管描述信息
MAVEN_REPO_URL=http://localhost:8081/nexus/content/repositories/thirdparty
MAVEN_SNAPSHOT_REPO_URL=http://localhost:8081/nexus/content/repositories/thirdparty
POM_SCM_CONNECTION=scm:[email protected]
POM_SCM_DEV_CONNECTION=scm:[email protected]/xxx.git
##############################################################################
# 开发者,描述信息
POM_DEVELOPER_ID=dovsnier
POM_DEVELOPER_NAME=dovsnier
[email protected]
##############################################################################
# 声明,描述信息
POM_LICENSE_NAME=The Apache Software License, Version 2.0
POM_LICENSE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
POM_LICENSE_DISTRIBUTION=repo
由于上传到maven repo 上需要用户名和密码,此时可以放在本地机器全局gradle 配置下(如果没有,自己创建一个gradle.properties 文件),
路径:
C:\Users\xxx\.gradle\gradle.properties
#Nexus 默认用户名
NEXUS_USERNAME=admin
#Nexus 默认密码
NEXUS_PASSWORD=admin123
#
#GPG 秘钥ID
#signing.keyId=
#GPG 秘钥密码
#signing.password=
#GPG 秘钥文件路径
#signing.secretKeyRingFile=
上传到公共Maven 上的时候是需要GPG 这玩意的,上传本地的机器上暂时不需要配置这些;
4. 在android studio 中,打开console 窗口(Alt + F12),执行如下命令:
gradlew --info clean uploadArchives
如果没啥问题的话,执行成功后,如下所示:
如果遇到,如下的提示:
Could not find metadata ... library/maven-metadata.xml in remote (http://localhost:8081/nexus/content/repositories/thirdparty)
首次上传该库的时候找不到metadata,其实上面是有的,后续版本的上传就不会提示了;
上传到本地maven 路径成功后,可登陆Nexus 上瞅瞅,如图所示:
此时,过程结束;
参考
1android-maven-gradle-plugin