目的
最近在搞项目拆分,分层成库和技术库Maven 化,实际中遇到比较蛋疼的问题,记录下来以备后时只需;
环境准备与配置
1. Android Studio: <code>v3.1.2</code>
2. Android-maven-gradle-plugin: <code>v2.0</code>
3. Gradle Version: <code>v4.1</code>
注意:
不同的版本对应关系,有不同的依赖问题,否则编译不通过哦;
具体细节,如图所示:
步骤
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 上瞅瞅,如图所示:
此时,过程结束;
参考