Android Studio 搭建和使用Maven仓库

https://www.cnblogs.com/lixiangyang521/p/7760754.html

我们都知道,Android Studio导入jar包非常方便,一行代码搞定

dependencies {
  compile'com.facebook.fresco:fresco:1.0.1'
}

相信大家对该种写法一定不陌生,这里用到的就是Maven(仓库)概念。

定义

Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。简单来说管理jar包的

创建Maven项目

新建一个android library,这个module就是要提供给别人的。在build.gradle添加如下:

apply plugin: 'maven'

uploadArchives {
repositories.mavenDeployer {
repository(url: LOCAL_REPO_URL)
pom.groupId = GROUP
pom.artifactId = POM_ARTIFACT_ID
pom.version = VERSION     
 }
}

gradle.properties文件配置属性

#MAVEN需要的配置
GROUP=com.test.android
POM_ARTIFACT_ID=testUI
VERSION=1.0.0
//这里 指定生成的Maven路径
LOCAL_REPO_URL=file:///Users/caojiaming/StudioProjects/maven/

点一下 同步 (Sync Project with Gradle Files)
在Android Studio 右侧的Gradle Projects 

一切正常的话会在gradle.propertiesLOCAL_REPO_URL看到生成的文件,如图

至此本地已经发布成功,可以看到默认生成的是aar。接下来看一下如何引用
在需要此依赖的项目里build.gradle里添加

repositories {
    maven {
        url 'file:///Users/caojiaming/StudioProjects/maven/'
    }
}
dependencies {
    compile 'com.test.android:testUI:1.0.0'
}

有的gradle版本需要在版本后追加@aar(笔者没有遇到过)

扫描二维码关注公众号,回复: 8640567 查看本文章
dependencies {
    compile 'com.test.android:testUI:1.0.0@aar'
}

compile的生成规则在前面配置的gradle.propertiesGROUPPOM_ARTIFACT_IDVERSION共同决定


以上都是在本地仓库玩的。但实际这并没什么用,至少你要发布到服务器上才会有切合实际的用处。这里先说一下发布到私有服务器上的步骤。

Nexus的搭建

什么是Nexus:Nexus Repository Manager是一个需要Java运行时环境的Java应用程序。运行Nexus Repository Manager时,您正在运行带有基于Web的用户界面的服务器应用程序。该应用程序本身与Eclipse Jetty servlet容器和Apache Karaf OSGi容器一起运行。更详细的介绍请参阅官方文档

下载地址:https://www.sonatype.com/download-oss-sonatype

启动Nexus服务

打开终端命令行依次输入


cd /Users/caojiaming/StudioProjects/nexus-3.3.2-02-mac/nexus-3.3.2-02/bin (懒得配置环境变量)

./nexus start
你会看到Starting nexus提示,证明服务已经启动

浏览器输入:http://localhost:8081

点击Sigin in
账号:admin 密码admin123

然后按照上图操作copy远程库的地址,稍后会用到

重新配置 gradle.properties

RELEASE_URL=http://127.0.0.1:8081/repository/maven-releases/
SNAPSHOT_URL=http://127.0.0.1:8081/repository/maven-snapshots/
NAME=admin
PASSWORD=admin123

还记得刚刚点击的copy吗,替换文中的地址即可。

在library module新建maven_push.gradle

apply plugin: 'maven'
apply plugin: 'signing'

configurations {
    deployerJars
}

repositories {
    mavenCentral()
}

// 判断版本是Release or Snapshots
def isReleaseBuild() {
    return !VERSION.contains("SNAPSHOT");
}

// 获取仓库url
def getRepositoryUrl() {
    return isReleaseBuild() ? RELEASE_URL : SNAPSHOT_URL;
}

uploadArchives {
    repositories {
        mavenDeployer {
            beforeDeployment {
                MavenDeployment deployment -> signing.signPom(deployment)
            }

            pom.version = VERSION
            pom.artifactId = POM_ARTIFACT_ID
            pom.groupId = GROUP

            repository(url: getRepositoryUrl()) {
                authentication(userName: NAME, password: PASSWORD) // maven授权信息
            }
        }
    }
}

// 进行数字签名
signing {
    // 当 发布版本 & 存在"uploadArchives"任务时,才执行
    required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
    sign configurations.archives
}

build.gradle开头添加
apply from: 'maven_push.gradle'

Gradle任务窗口再次点击

打开nexus查看上传文件

如何引用

之前提到过本地maven,替换url即可

repositories {
    maven {
        url 'file:///Users/caojiaming/StudioProjects/maven/'
    }
}

替换后

repositories {
    maven {
        url 'http://127.0.0.1:8081/repository/maven-releases/'
    }
}

compile无需改变,因为GROUPPOM_ARTIFACT_IDVERSION均无变化
到此全部工作完成。

写代码

新建GradleTest

package com.maven.studio.library;

public class GradleTest {
    public void display(){
        System.out.println("gradle test");
    }
}

新建gradle.properties

library module 下新建gradle.properties,并配置:

VERSION=1.0
GROUP_ID=com.maven.studo.library
ARTIFACT_ID=test

RELEASE_URL=http://192.168.86.130:8081/repository/{release仓库名}/
SNAPSHOT_URL=http://192.168.86.130:8081/repository/{snapshot仓库名}/

NAME=admin
PASSWORD=admin123

当然在工程目录下的gradle.properties配置,也是可以的。192.168.86.130是maven仓库ip地址。

新建gradle上传脚本

在library module下,新建maven_push.gradle

apply plugin: 'maven'
apply plugin: 'signing'

configurations {
    deployerJars
}

repositories {
    mavenCentral()
}

// 判断版本是Release or Snapshots
def isReleaseBuild() {
    return !VERSION.contains("SNAPSHOT");
}

// 获取仓库url
def getRepositoryUrl() {
    return isReleaseBuild() ? RELEASE_URL : SNAPSHOT_URL;
}

uploadArchives {
    repositories {
        mavenDeployer {
            beforeDeployment {
                MavenDeployment deployment -> signing.signPom(deployment)
            }

            pom.version = VERSION
            pom.artifactId = ARTIFACT_ID
            pom.groupId = GROUP_ID

            repository(url: getRepositoryUrl()) {
                authentication(userName: NAME, password: PASSWORD) // maven授权信息
            }
        }
    }
}

// 进行数字签名
signing {
    // 当 发布版本 & 存在"uploadArchives"任务时,才执行
    required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
    sign configurations.archives
}

snapshot版是不需要进行数字签名的,但release必须数字签名。

更多任务

例如对工程生成javadoc.jar、上传source.jar,只要在maven_push.gradle加上:

// type显示指定任务类型或任务, 这里指定要执行Javadoc这个task,这个task在gradle中已经定义
task androidJavadocs(type: Javadoc) {
    // 设置源码所在的位置
    source = android.sourceSets.main.java.sourceFiles
}

// 生成javadoc.jar
task androidJavadocsJar(type: Jar) {
    // 指定文档名称
    classifier = 'javadoc'
    from androidJavadocs.destinationDir
}

// 生成sources.jar
task androidSourcesJar(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.sourceFiles
}

// 产生相关配置文件的任务
artifacts {
    archives androidSourcesJar
    archives androidJavadocsJar
}

导入上传脚本

然后在library/build.gradle导入maven_push.gradle脚本:

apply from: 'maven_push.gradle'

执行gradle上传任务

然后Sync gradle一下,会发现Gradle任务窗口,多了upload任务快,里面有uploadArchives task. 右键->Run双击

uploadArchives

deploy

显示BUILD SUCCESS后,打开nexus界面-> component

upload success

com.maven.studio.library上传成功!


Gradle引入依赖

gradle配置

修改工程根目录build.gradle

allprojects {
    repositories {
        jcenter()

        // maven { url "http://192.168.86.130:8081/repository/{release仓库名}/" }
        maven { url "http://192.168.86.130:8081/repository/{snapshot仓库名}/" }
    }
}

修改module下的build.gradle

dependencies {
    ...

    // groupId : artifactId : version
    compile 'com.maven.studio.library:test:1.0-SNAPSHOT'
}

Sync gradle同步一下maven仓库,如果gradle build完成,证明成功引入依赖了。

发布了74 篇原创文章 · 获赞 36 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/kdsde/article/details/90915634