android studio的maven私服使用

本文详述了如何在Android Studio中利用Artifactory进行Maven配置,并提供了自动化部署脚本,支持一键部署所有模块及其依赖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

本文主要介绍在android studio中使用artifactory进行maven配置的最终方案,具体过程及工作原理可参考 android studio的maven私服使用配置踩坑实录 中的介绍

本文不介绍MAVEN + JENKINS + ARTIFACTORY整合的具体内容,有兴趣的同学可通过 上一篇文章 中的传送门了解更多


以下为正文

涉及到的文件

  • 各module的build.gradle
    按maven方式依赖lib module,如:
//v_lib_db 在gradle.properties
compile "com.xiwei.commonlib:lib_db:${v_lib_db}"

以下文件均在android studio 工程的根目录

  • artifactory.gradle(新建)
  • artifactory_version.properties (新建)
  • build.gradle
  • deploy.sh(新建)
  • modify.sh(新建)
  • deploy.bat(新建)
  • modify.bat(新建)
  • gradle.properties

文件内容

artifactory.gradle

allprojects {
    repositories {
        maven { url 'http://repo.jfrog.org/artifactory/gradle-plugins' }
        maven{
            url 'http://192.168.199.119:8080/artifactory/libs-release-local'
        }
        maven{
            url 'http://192.168.199.119:8080/artifactory/libs-snapshot-local'
        }
    }
}

def SNAPSHOT_MAVEN_TYPE = 'snapshot'
subprojects {
    //artifactory相关
    apply plugin: 'com.jfrog.artifactory'
    apply plugin: 'maven-publish'

    //读取module的version
    def Properties props = new Properties()
    File propFile = file(file("temp").parentFile.parentFile.absolutePath + "/artifactory_version.properties");
    if (propFile.exists()) {
        props.load(new FileInputStream(propFile))
    }
    def myGroupId = 'com.xiwei.commonlib'
    def maven_type = props.getProperty("maven_type")
    ext{
        //定义该module是否进行deploy
        deploy = true //若project不需要deploy到maven上,在project的build.gradle中添加代码:project.ext.deploy = false
        versionType = maven_type == SNAPSHOT_MAVEN_TYPE ? '-SNAPSHOT' : ''
    }
    publishing {
        publications {
            aar(MavenPublication) {
                if (!project.hasProperty('android') || !project.ext.deploy)
                    return
                def libVersion = "${props.getProperty(project.name)}${versionType}"
                println("${project.getName()}:${libVersion}")

                groupId myGroupId
                version = libVersion
                artifactId project.getName()

                // Tell maven to prepare the generated "*.aar" file for publishing
                artifact("${buildDir}/outputs/aar/${project.getName()}-release.aar")

                //The publication doesn't know about our dependencies, so we have to manually add them to the pom
                pom.withXml {
                    //Creating additional node for dependencies
                    def dependenciesNode = asNode().appendNode('dependencies')

                    //Defining configuration names from which dependencies will be taken (debugCompile or releaseCompile and compile)
                    def configurationNames = ["releaseCompile", 'compile']
                    configurationNames.each { configurationName ->
                        project.configurations.getByName(configurationName).allDependencies.each {
                            if (it.group != null && it.name != null) {

                                def dependencyNode = dependenciesNode.appendNode('dependency')
                                dependencyNode.appendNode('groupId', it.group)
                                dependencyNode.appendNode('artifactId', it.name)
                                dependencyNode.appendNode('version', it.version)

                                //If there are any exclusions in dependency
                                if (it.excludeRules.size() > 0) {
                                    def exclusionsNode = dependencyNode.appendNode('exclusions')
                                    it.excludeRules.each { rule ->
                                        def exclusionNode = exclusionsNode.appendNode('exclusion')
                                        exclusionNode.appendNode('groupId', rule.group)
                                        exclusionNode.appendNode('artifactId', rule.module)
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    artifactory {//artifactory配置
        contextUrl = "${artifactory_contextUrl}"   //The base Artifactory URL if not overridden by the publisher/resolver
        publish {
            repository {
                repoKey = maven_type == SNAPSHOT_MAVEN_TYPE ? 'libs-snapshot-local' : 'libs-release-local'
                username = "${artifactory_user}"
                password = "${artifactory_password}"
                maven = true
            }
            defaults {
                skip = !(project.ext.deploy)
                // Tell the Artifactory Plugin which artifacts should be published to Artifactory.
                publications('aar')
                publishArtifacts = true

                // Properties to be attached to the published artifacts.
                properties = ['qa.level': 'basic', 'dev.team': 'core']
                // Publish generated POM files to Artifactory (true by default)
                publishPom = true //Publish generated POM files to Artifactory (true by default)
                publishIvy = false //Publish generated Ivy descriptor files to Artifactory (true by default)
            }

        }
    }
}

artifactory_version.properties

##############################################################################
#
#   打包设置信息
#       开发环境下,maven_type为snapshot
#       测试&正式环境下,maven_type为release
#       module升级版本时,依赖该module的module也要升级版本
#
#   开发者进行版本升级发布只需要更新这个文件即可
#   发布单个module:
#       升级模块名称对应的版本号(注:snapshot发布不需要更新版本,直接调用./deploy.sh 模块名称)
#       ./deploy.sh 模块名称     如:./deploy.sh lib_db
#
#   发布所有module:
#       升级所有需要升级的module对应的版本号
#       ./deployAll.sh
##############################################################################

#发布的类型:snapshot/release
maven_type=snapshot

#lib升级版本时,要

lib_utils=1.0.0
#...others
lib_xiwei_common=1.0.5

build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.
apply from: "artifactory.gradle"

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
        //artfactory plugin need
        classpath(group: 'org.jfrog.buildinfo', name: 'build-info-extractor-gradle', version: '4.1.1')

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

deploy.sh

#!/bin/sh

#================================================================================================
# usage:
#       发布所有module: ./deploy.sh -a
#       发布单个module: ./deploy.sh lib_db
# 注:
#   1. 从release版到snapshot发布时,需要修改artifactory_version.properties的类型为snapshot,反之亦然
#   2. snapshot版本更新时,无需更新版本号,直接deploy即可
#================================================================================================

function deploy() {

    #按照artifactory_version.properties里配置的版本进行发布
    ./gradlew :$1:clean :$1:assembleRelease :$1:artifactoryPublish

    #将gradle.properties里的版本改成与artifactory_version.properties里的配置一致
    ROOT=${PWD}
    ./modify.sh $1 $ROOT/
}

param=$1
if [[ ${param} = '-a' ]]; then
    #发布所有module到maven
    #注意依赖顺序:被依赖的要放在前面
    deploy lib_utils
    #...others
    deploy lib_xiwei_common
else
    deploy $1
fi

modify.sh

#!/bin/sh

#################################################################################
#
#       从一个文件中读取配置,并替换另一个文件中对应的配置项
#       usage: ./modify lib_db
#           效果为:将build.gradle的v_lib_db=1.0.0 替换为 v_lib_db=1.0.1
#
#################################################################################


#project的版本定义文件
SOURCE_FILE_NAME="artifactory_version.properties"
#dependencies的版本定义文件
GRADLE_FILE_NAME=$2"gradle.properties"
#从SOURCE_FILE_NAME的key到GRADLE_FILE_NAME的key需要添加的前缀:比如:lib_db -> v_lib_db 前缀为 v_
KEY_PRE_FIX="v_"

function contains
{
    STRING_A=$1
    STRING_B=$2
    if [[ ${STRING_A/${STRING_B}//} == $STRING_A ]]
    then
        return 0
    else
        return 1
    fi
}

function replace_prop() {
    KEY=$1
    VALUE=$2
    SUFFIX=''
    if [[ ${maven_type} = 'snapshot' ]]; then
        SUFFIX='-SNAPSHOT'
    fi
    cat $GRADLE_FILE_NAME | while read LINE
    do
        contains $LINE "$KEY_PRE_FIX$KEY="
        result=$?
        if [[ $result = 1 ]]; then
            #包含$KEY_PRE_FIX$2=的行内容替换为v_$2=$3
            sed -ig "s/$LINE/$KEY_PRE_FIX$KEY=$VALUE$SUFFIX/g" ${GRADLE_FILE_NAME}
            rm -f ${GRADLE_FILE_NAME}g
            return
        fi
    done
}
#读取需要拷贝的properties文件
. ${SOURCE_FILE_NAME}
#todo check params
#替换GRADLE_FILE_NAME文件中key为$1的行内容:例如v_lib_db=1.0.0 -> v_lib_db=1.0.1
replace_prop $1 ${!1}

deploy.bat

@echo off

    REM ** edit common libs dependencies ***
set ROOT=%cd%


if /i "%1"=="-a" (
    call:deploy lib_utils
    rem ...others
    call:deploy lib_xiwei_common
    goto :eof
) else (
    call:deploy %1
    goto :eof
)

:deploy
    call gradlew :%1:clean :%1:assembleRelease :%1:generatePomFileForAarPublication :%1:artifactoryPublish
    call %~dp0modify.bat %1 %ROOT%
goto :eof

modify.bat

@echo off
setlocal enabledelayedexpansion

SET ROOT=%~dp0
SET CONFIG_FILE=%ROOT%artifactory_version.properties
SET GRADLE_PATH=%2
SET GRADLE_FILE_NAME=%GRADLE_PATH%gradle.properties
SET TEMP=%GRADLE_PATH%tmp.properties
SET KEY_PRE_FIX=v_

FOR /F "tokens=1,2 delims==" %%i in (%CONFIG_FILE%) DO (
 SET %%i=%%j
)
set SUFFIX=
if /i "%maven_type%"=="snapshot" (
    set SUFFIX=-SNAPSHOT
)
call:replace_prop %1 !%1!
goto :eof

:replace_prop
    set KEY=%KEY_PRE_FIX%%~1=
    set VALUE=%~2
    set /a index=0
    del  /f /s /q /a %TEMP%
        for /f "delims=" %%a in ('findstr /n .* %GRADLE_FILE_NAME%') do (
        set /aindex=!index! + 1
        set "str=%%a"
        set contains=false
        echo !str!|find "%KEY%">nul&&set contains=true
        if /i "!contains!"=="true" (
            echo %KEY%%VALUE%%SUFFIX%>>%TEMP%
        ) else (
            if !index! gtr 99 (
                echo.!str:~4!>>%TEMP%
            ) else (
                if !index! gtr 9 (
                    echo.!str:~3!>>%TEMP%
                ) else (
                    echo.!str:~2!>>%TEMP%
                )
            )
        )
    )
    del %GRADLE_FILE_NAME%
    ren %TEMP% gradle.properties
goto :eof

gradle.properties

artifactory_user=yourusername
artifactory_password=yourpassword
artifactory_contextUrl=http://192.168.199.119:8080/artifactory

v_lib_utils=1.0.0
#...others
v_lib_xiwei_common=1.0.5

使用方式

  • module修改后,artifactory_version.properties中对应module及传递依赖的module要进行升级,并将maven_type改为snapshot进行发布
  • 测试验收结束后,maven_type改为release进行发布(调用)
  • 发布命令
    • 发布单个module:
      • mac: ./deploy.sh moduleName
      • windows: deploy.bat moduleName
    • 发布当前工程中的所有module:
      • mac: ./deploy.sh -a
      • windows: deploy.bat -a

2016-07-14添加

在实际使用中发现还是不够方便:
  1. module之间存在依赖关系时,发生修改后需要手动deploy改动的module和所有直接/间接依赖该module的所有module
  2. 用这种方式将工程从之前的module依赖改为maven依赖的过程比较费时
  3. 同时维护shell脚本和batch脚本成本较大
为了解决这些问题,做了以下改动:
  1. 添加自动deploy直接/间接依赖当前发布脚本的所有module的功能,从而实现一键deploy
  2. 提供自动按照依赖关系顺序deploy all的功能
  3. shell脚本和batch脚本的功能用python脚本来实现
demo传送门:Android studio基于artifactory的maven私服一键deploy工具

原文地址:http://blog.youkuaiyun.com/cdecde111/article/details/51777427

<think>好的,我现在需要帮助用户解决在Android Studio中配置和使用Maven的问题。用户已经提供了一些引用资料,我需要结合这些信息来构建一个清晰的步骤指南。首先,我得理清用户的需求:他们想了解如何在Android Studio中配置Maven仓库,包括上传本地库和引用远程仓库。 首先,我应该回顾用户提供的引用内容。引用[1]提到在module的build.gradle中应用上传脚本,然后在Gradle窗口找到任务上传。引用[2]是关于配置阿里云的Maven仓库地址,引用[3]和引用[5]涉及使用GitHub的raw URL和本地Maven仓库。引用[4]则提到了使用Maven Push插件和配置用户名密码。 接下来,我需要将这些信息组织成逻辑步骤。首先,用户可能需要配置远程仓库,比如阿里云或私有仓库,这涉及修改项目的build.gradle文件,添加repositories部分。然后,如果用户需要上传自己的库到Maven,需要配置上传脚本,如引用[1]和引用[4]提到的,包括应用上传脚本和设置认证信息。 可能需要注意的地方包括:如何正确应用上传脚本,配置仓库地址的位置(项目级还是模块级),以及如何处理认证信息的安全问题,比如使用gradle.properties存储敏感数据。此外,用户可能还需要了解如何引用本地或远程的Maven依赖,这部分需要指导他们在模块的build.gradle中添加依赖声明。 另外,用户可能遇到的常见问题包括仓库地址错误、认证失败、依赖无法解析等,需要给出一些排查建议,比如检查URL、网络连接、用户名密码是否正确等。还要注意不同仓库的优先级,比如可能要先检查本地再远程,或者顺序影响依赖解析。 最后,生成相关问题时要覆盖配置、优化、应用场景和问题排查等方面,确保用户能进一步探索相关主题。需要确保所有步骤都符合用户提供的引用内容,并且使用正确的中文表达,避免技术术语错误。</think>### 如何在 Android Studio 中配置和使用 Maven? #### 一、配置 Maven 仓库地址 1. **添加远程仓库** 在项目根目录的 `build.gradle` 文件中,通过 `repositories` 块声明仓库地址。例如: ```groovy allprojects { repositories { google() jcenter() // 私有 Maven 仓库 maven { url 'http://localhost:8081/nexus/content/repositories/maven' } // 阿里云仓库 maven { url 'https://maven.aliyun.com/repository/public' } // GitHub 或其他自定义仓库 maven { url 'https://raw.githubusercontent.com/xxx' } } } ``` 引用[^1][^2][^3] 2. **配置认证信息(私有仓库)** 在 `gradle.properties` 文件中定义仓库的用户名和密码: ```properties SNAPSHOT_REPOSITORY_URL=开发环境地址 RELEASE_REPOSITORY_URL=生产环境地址 maven_local_username=用户名 maven_local_psw=密码 ``` 引用[^4] --- #### 二、上传库到 Maven 仓库 1. **配置上传脚本** 在模块的 `build.gradle` 中应用上传脚本: ```groovy apply from: 'uploadToMaven.gradle' ``` 此脚本需包含 Maven 发布插件和仓库配置,例如: ```groovy apply plugin: 'maven-publish' publishing { publications { mavenJava(MavenPublication) { groupId = 'com.example' artifactId = 'mylibrary' version = '1.0.0' from components.java } } repositories { maven { url = version.endsWith('SNAPSHOT') ? SNAPSHOT_REPOSITORY_URL : RELEASE_REPOSITORY_URL credentials { username maven_local_username password maven_local_psw } } } } ``` 引用 2. **执行上传任务** 在 Android Studio 的 Gradle 面板中找到模块的 `publish` 任务,双击运行即可上传。 --- #### 三、引用本地或远程 Maven 库 1. **添加依赖** 在模块的 `build.gradle` 中声明依赖: ```groovy dependencies { implementation 'com.example:mylibrary:1.0.0' } ``` 确保仓库配置中已包含该库的地址[^5]。 2. **本地 Maven 仓库** 若使用本地仓库(如 `~/.m2`),添加以下配置: ```groovy repositories { mavenLocal() } ``` 引用 --- #### 四、常见问题排查 1. **依赖无法解析** - 检查仓库地址是否正确(如 HTTPS/HTTP 协议差异)[^2]。 - 确认网络连接或私有仓库权限。 2. **上传失败** - 验证 `gradle.properties` 中的用户名和密码是否匹配。 - 检查版本号是否冲突(如 SNAPSHOT 和 RELEASE 区分)[^1]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值