公共模块版本号统一管理

公共模块版本号统一管理

配置版本需要修改3个地方的文件,在此讲解app和library的工程版本配置。

工程目录如下图:

这里写图片描述

注意:下面我们说明中指定某个文件用这种方式:root/build.gradle(root目录下的build.gradle文件)

配置步骤


1 root/build.gradle文件修改

//apply from: 'https://raw.githubusercontent.com/szhittech/maven/master/config.gradle'
apply from: '../config.gradle'
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.2'
        classpath 'me.tatarka:gradle-retrolambda:3.2.0'
        // 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
}

1.在root/build.gradle的开头增加一行代码即可:
apply from: '../config.gradle'公共模块的public根目录下有config.gradle,这个文件一旦修改必须立马提交svn,这个很重要

2 root/gradle.properties文件修改

直接上代码吧,就是这么简单:

# gradle加速
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.parallel=true
org.gradle.configureondemand=true


#1.如果此处定义NEXUS_TYPE=maven,项目就提交到:https://oss.sonatype.org
#2.如果此处不定义或者定义NEXUS_TYPE的值不为mavan,那么项目提交到:http://200.200.200.40:8083/nexus
#NEXUS_TYPE=maven
# 如果要提交源码,就定义此变量,否则不定义;注意:仅仅只有快照版才能提交源码,如果是releasae版,定义了此变量也无效
SOURCESCODE

#GPG秘钥ID
signing.keyId=FB58CB54
#GPG秘钥密码
signing.password=2475431305
#GPG秘钥文件路径
signing.secretKeyRingFile=secring.gpg

1.如果此处定义NEXUS_TYPE=maven,项目就提交到:https://oss.sonatype.org

2.如果此处不定义或者定义NEXUS_TYPE的值不为mavan,那么项目提交到:http://200.200.200.40:8083/nexus

3 SOURCESCODE是在发布SNATSHOT版的时候定义,表示将代码已源码形式发布,便于调试而已

4 GPG秘钥信息,这些默认就可以了,用于发布JCenter的release版用

以上代码直接Copy到项目就可以


3 app/build.gradle文件修改

先上代码吧,^_^:

apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'

android {
    //andorid的编译版本配置
    compileSdkVersion rootProject.ext.android.compileSdkVersion
    buildToolsVersion rootProject.ext.android.buildToolsVersion

    defaultConfig {
        applicationId "com.het.bind"
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode rootProject.ext.android.versionCode
        versionName rootProject.ext.android.versionName
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }

    lintOptions{
        abortOnError false
    }
    sourceSets { main { assets.srcDirs = ['src/main/assets', 'src/main/assets/'] } }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    //第三方库依赖
    compile rootProject.ext.thirddependencies["appcompat-v7"]
    //绑定模块
    compile(rootProject.ext.dependencies["hetbinduisdk"]) { changing = true; }
}
configurations.all {
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}

1.Android的编译版本,照着写就OK了;

2.第三方库依赖示例:compile rootProject.ext.thirddependencies["appcompat-v7"]

3.HeT模块依赖示例:以绑定模块的依赖为例(compile(rootProject.ext.dependencies["hetbinduisdk"]) { changing = true; }) 就这么简单,再也不用担心版本号了。


4 library/build.gradle文件修改

代码如下:

apply plugin: 'com.android.library'
apply plugin: 'me.tatarka.retrolambda'

android {
    //Android编译版本
    compileSdkVersion rootProject.ext.android.compileSdkVersion
    buildToolsVersion rootProject.ext.android.buildToolsVersion

    defaultConfig {
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode rootProject.ext.android.versionCode
        versionName rootProject.ext.android.versionName
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }
    lintOptions{
        abortOnError false
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile(rootProject.ext.dependencies["hetbasicsdk"]) { changing = true; }
}

configurations.all {
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}

//设置modulename局部变量
ext {
    //这个地方的设置一定要正确,很重要,填写错误后果很严重!
    modulename = rootProject.ext.libsname.hetbindbizsdk
}
apply from: 'https://raw.githubusercontent.com/szhittech/maven/master/upload.gradle'

1.Android编译版本,照着写就OK;

2.设置modulename局部变量,这个设置很重要,书写规则:modulename = rootProject.ext.libsname.xxx
这里的xxx就是项目名称,取值必须参照config.gradle里面的libsname集合,后面展示config.gradle源代码;

3.发布的脚本依赖:https://raw.githubusercontent.com/szhittech/maven/master/upload.gradle,当然,如果网络不好,这个地方也可以配置成本地依赖

4.删除library/gradle.properties


开始谈谈config.gradle配置文件吧,以后版本配置都是在这个文件里面配置,每次修改必须提交svn

Config.gradle配置文件

文件位置:http://61.141.158.190:1080/svn/repositories/android/code/trunk/public/config.gradle

建议将public整个文件夹从svn拉下来,然后可以用Android Studio去加载public目录中的项目,不要将项目单独拉下来

文件地址

def isHet() {
    def has = hasProperty('NEXUS_TYPE');
    if (has) {
        return NEXUS_TYPE.contains("maven") ? false : true;
    } else {
        return true;
    }
}
//全局扩展参数
ext {
    //默认参数配置
    config = [GROUP                  : "com.github.szhittech",
              POM_PACKAGING          : "aar",
              HET_NEXUS_RELEASES     : "http://200.200.200.40:8083/nexus/content/repositories/releases/",//#发布releases版的地址
              HET_NEXUS_SNAPSHOTS    : "http://200.200.200.40:8083/nexus/content/repositories/snapshots/",//#发布snapshots版的地址
              JCENTER_NEXUS_SNAPSHOTS: "https://oss.sonatype.org/content/repositories/snapshots/",//#JCenter快照版snapshots的地址
              JCENTER_NEXUS_RELEASES : "https://oss.sonatype.org/service/local/staging/deploy/maven2/",//#JCenter快照版RELEASES 的地址
              NEXUS_USERNAME         : "szhittech",
              NEXUS_PASSWORD         : "het123456",
              NEXUS_USERNAME_HET     : "admin",
              NEXUS_PASSWORD_HET     : "admin123",
              POM_DESCRIPTION        : "szhittech",
              POM_URL                : "https://github.com/szhittech/szhittech",
              POM_SCM_URL            : "https://github.com/szhittech/szhittech",
              POM_SCM_CONNECTION     : "scm:git@github.com:szhittech/szhittech.git",
              POM_SCM_DEV_CONNECTION : "scm:git@github.com:szhittech/szhittech.git",
              POM_LICENCE_NAME       : "The Apache Software License, Version 2.0",
              POM_LICENCE_URL        : "http://www.apache.org/licenses/LICENSE-2.0.txt",
              POM_LICENCE_DIST       : "repo",
              POM_DEVELOPER_ID       : "szhittech",
              POM_DEVELOPER_ID       : "szhittech"

    ]

    allprojects {
        repositories {
            if (isHet()) {
                //设置本地nexus仓库环境地址
                maven { url config.HET_NEXUS_RELEASES }
                maven { url config.HET_NEXUS_SNAPSHOTS }
            } else {
                //设置远程nexus仓库环境地址
                maven { url config.JCENTER_NEXUS_SNAPSHOTS }
                maven { url config.JCENTER_NEXUS_RELEASES }
            }
        }
    }

    //Android编译版本管理
    android = [compileSdkVersion: 23,
               buildToolsVersion: "23.0.1",
               minSdkVersion    : 15,
               targetSdkVersion : 23,
               versionCode      : 1,
               versionName      : "1.0"]

    //第三方依赖库
    thirddependencies = ["appcompat-v7"       : 'com.android.support:appcompat-v7:23.0.1',
                         "logging-interceptor": 'com.squareup.okhttp3:logging-interceptor:3.1.2',
                         "rxandroid"          : 'io.reactivex:rxandroid:1.2.1',
                         "adapter-rxjava"     : 'com.squareup.retrofit2:adapter-rxjava:2.0.2',
                         "retrofit"           : 'com.squareup.retrofit2:retrofit:2.1.0',
                         "converter-gson"     : 'com.squareup.retrofit2:converter-gson:2.0.0-beta3',
                         "gson"               : 'com.google.code.gson:gson:2.6.2',
                         "activeandroid"      : 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT',
                         "butterknife"        : 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT',
                         "fresco"             : 'com.facebook.fresco:fresco:0.9.0+'
    ]

    //如果要提交release版,则定义snapshot=""
    String snapshot = "-SNAPSHOT"
//    String snapshot = ""
    //HeT模块版本
    libsversion = [hetapmodule      : "1.0.0" + snapshot,//和而泰AP绑定(hetapmodule) 模组ID:28
                   hetsmartlink     : "1.0.0" + snapshot, //和而泰smartlink绑定(在庆科基础上修改 hetsmartlink) 模组ID:10
                   realtekmodule    : "1.0.0" + snapshot,//科中龙(realtekmodule) 模组ID:4
                   xlwmodule        : "1.0.0" + snapshot,//新力维_NL6621底层库(xlwmodule) 模组ID:6
                   sctechmodule     : "1.0.0" + snapshot,//双驰达(sctechmodule) 模组ID:15
                   elianmodule      : "1.0.0" + snapshot,//信驰达_MTK7681底层库(elianmodule) 模组ID:5
                   marvellmodule    : "1.0.0" + snapshot,//Marvell(marvellmodule) 模组ID:v1=8,v2=27
                   esptouchmodule   : "1.0.0" + snapshot, //乐鑫信息科技(esptouchmodule) 模组ID:7
                   cooeemodule      : "1.0.0" + snapshot,//博通(cooeemodule) 模组ID:20

                   hetlogsdk        : "1.0.0" + snapshot,//全局日志库
                   hetbindbizsdk    : "1.0.2" + snapshot,//绑定业务库
                   hetbinduisdk     : "1.0.2" + snapshot,//绑定界面库
                   hetudpsdk        : "1.0.4" + snapshot,//udp通讯库
                   hetxmlprotocolsdk: "1.0.0" + snapshot,//xml协议解析库
                   hetbasicsdk      : "1.0.5" + snapshot//xml协议解析库
    ]

    //HeT模块名称
    libsname = [hetapmodule      : "hetapmodule",
                hetsmartlink     : "hetsmartlink",
                realtekmodule    : "realtekmodule",
                xlwmodule        : "xlwmodule",
                sctechmodule     : "sctechmodule",
                elianmodule      : "elianmodule",
                marvellmodule    : "marvellmodule",
                esptouchmodule   : "esptouchmodule",
                cooeemodule      : "cooeemodule",

                hetlogsdk        : "hetlogsdk",
                hetbindbizsdk    : "hetbindbizsdk",
                hetbinduisdk     : "hetbinduisdk",
                hetudpsdk        : "hetudpsdk",
                hetxmlprotocolsdk: "hetxmlprotocolsdk",
                hetbasicsdk      : "hetbasicsdk"
    ]

    //HeT依赖库
    dependencies = ["hetapmodule"      : "${config.GROUP}:${libsname.hetapmodule}:${libsversion.hetapmodule}",
                    "hetsmartlink"     : "${config.GROUP}:${libsname.hetsmartlink}:${libsversion.hetsmartlink}",
                    "realtekmodule"    : "${config.GROUP}:${libsname.realtekmodule}:${libsversion.realtekmodule}",
                    "xlwmodule"        : "${config.GROUP}:${libsname.xlwmodule}:${libsversion.xlwmodule}",
                    "sctechmodule"     : "${config.GROUP}:${libsname.sctechmodule}:${libsversion.sctechmodule}",
                    "elianmodule"      : "${config.GROUP}:${libsname.elianmodule}:${libsversion.elianmodule}",
                    "marvellmodule"    : "${config.GROUP}:${libsname.marvellmodule}:${libsversion.marvellmodule}",
                    "esptouchmodule"   : "${config.GROUP}:${libsname.esptouchmodule}:${libsversion.esptouchmodule}",
                    "cooeemodule"      : "${config.GROUP}:${libsname.cooeemodule}:${libsversion.cooeemodule}",

                    "hetlogsdk"        : "${config.GROUP}:${libsname.hetlogsdk}:${libsversion.hetlogsdk}",
                    "hetbindbizsdk"    : "${config.GROUP}:${libsname.hetbindbizsdk}:${libsversion.hetbindbizsdk}",
                    "hetbinduisdk"     : "${config.GROUP}:${libsname.hetbinduisdk}:${libsversion.hetbinduisdk}",
                    "hetudpsdk"        : "${config.GROUP}:${libsname.hetudpsdk}:${libsversion.hetudpsdk}",
                    "hetxmlprotocolsdk": "${config.GROUP}:${libsname.hetxmlprotocolsdk}:${libsversion.hetxmlprotocolsdk}",
                    "hetbasicsdk"      : "${config.GROUP}:${libsname.hetbasicsdk}:${libsversion.hetbasicsdk}"
    ]
}

//打印当前申明的library的版本号,编译操作者检查,根据此日志在提交的时候要核对版本正确性
ext.libsversion.each {  //调用它的each函数,只要传入一个Closure就可以了。
    println "###当前版本: ${it}"
}

//提交Maven的Task任务,此Task将提交工程中Setting.gradle中申明的所有library工程,执行此Task一定要检查library版本和依赖的正确性,要很慎重!!!
task upload() {
    Set<Project> uploadProjects = new HashSet<>();
    logger.lifecycle('【**下面是需要提交的项目列表,请仔细检查**】')
    getSubprojects().each {
        boolean isExists = it.getBuildFile().exists()
        if (isExists) {
            boolean isLibrary = it.getBuildFile().getText().contains('com.android.library')
            if (isLibrary) {
                boolean noSubProject = it.getSubprojects().isEmpty()
                if (noSubProject) {
                    String pro = rootProject.ext.dependencies[it.name]
                    if (pro != null) {
                        logger.lifecycle('***正常:' + rootProject.ext.dependencies[it.name])
                        uploadProjects.add(it)
                    } else {
                        logger.log(LogLevel.ERROR, '***警告:' + it.name + '项目未配置版本控制,此项目提交未成功,请配置版本控制再提交!!!')
                    }
                }
            }

        }
    }
    dependsOn {
        uploadProjects.uploadArchives
    }
}

ext.config变量、ext.android变量这些默认就可以了

第三方依赖库(thirddependencies )

把所有的第三方依赖的库,统统的放在这个地方管理,写法嘛,照着写!

HeT公共模块的版本添加管理

主要分三步,也就是分别在三个变量里面去添加(libsversion 、libsname 、dependencies )

config.gradle在线编辑地址

参考

可以参考public/hetbindsdk,这个项目是已经改好的

<think>好的,用户想了解如何使用Maven管理多模块项目的版本,特别是最佳实践。我需要结合提供的引用内容来回答这个问题。首先,用户提到了三个引用,其中引用[2]讨论了多模块项目与继承的区别,以及如何通过父POM管理公共依赖。引用[3]提到了插件配置,这可能与统一管理插件版本有关。引用[1]虽然主要讲依赖范围,但可能对传递性依赖管理有参考价值。 首先,我应该从父POM的作用开始。多模块项目通常有一个父模块,子模块继承父POM的配置。这样可以统一版本号,避免重复。引用[2]中提到当项目共享依赖时使用继承,所以统一版本管理应该在父POM中完成。 其次,版本属性。在父POM中使用<properties>定义版本变量,比如<spring.version>,然后在依赖中引用该变量。这样可以集中管理,方便升级。 然后是依赖管理部分。Maven的dependencyManagement允许父POM声明依赖版本,子模块引入时无需指定版本,确保一致性。引用[2]提到创建外部POM文件管理公共依赖,这类似于dependencyManagement的使用。 多模块结构方面,引用[2]提到多模块适用于不相关但组成大项目的情况,所以需要合理划分模块,比如core、api、web等,每个子模块有明确职责,避免循环依赖。 插件管理同样重要。父POM中使用pluginManagement统一插件版本和配置,如maven-compiler-plugin设置JDK版本,如引用[3]中的例子,这样可以确保所有子模块使用相同的编译配置。 持续集成方面,版本号管理可能需要结合CI工具,比如自动更新版本号或使用SNAPSHOT版本,但引用中没有直接提到,可能需要依靠常识补充。 最后,引用[2]中的最佳实践提到继承用于共享依赖,多模块用于组合项目,因此正确使用这两种机制是关键。同时,保持子模块版本与父模块同步,避免冲突。 用户可能还会关心如何处理不同子模块的不同版本需求,但根据最佳实践,应该尽量统一版本,除非有特殊需求。另外,版本号格式通常使用语义化版本控制,但引用中未提及,可能需要简要说明。 总结步骤:父POM集中管理版本、属性定义、依赖管理、插件管理、模块划分、持续集成整合。同时,相关问题可以涉及这些方面的具体实践,比如如何同步版本,如何处理不同模块的不同需求,或者如何管理插件版本。</think>### Maven多模块项目版本管理最佳实践 在Maven多模块项目中,版本管理需要结合**继承机制**和**依赖范围控制**来实现高效协同。以下是核心实践方法: --- #### 1. **统一父POM版本控制** - 所有子模块通过继承父模块的`<parent>`声明自动同步版本 - 父POM中定义全局属性: ```xml <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>5.3.18</spring.version> <junit.version>5.8.2</junit.version> </properties> ``` - 子模块继承时无需单独指定版本号,保持版本一致性[^2] --- #### 2. **依赖管理标准化** - 使用`dependencyManagement`统一声明依赖版本: ```xml <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> </dependencies> </dependencyManagement> ``` - 子模块引入依赖时省略`<version>`标签,避免版本冲突 --- #### 3. **模块版本同步策略** - **单版本模式**:所有模块共享同一版本号 ```xml <parent> <groupId>com.company</groupId> <artifactId>parent-pom</artifactId> <version>1.0.0</version> </parent> ``` - **独立版本模式**:核心模块可单独升级版本,但需注意依赖传递问题[^1] --- #### 4. **插件版本锁定** 在父POM中统一配置构建插件: ```xml <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </pluginManagement> </build> ``` 确保所有子模块使用相同的编译环境[^3] --- #### 5. **版本更新流程** 1. 修改父POM版本号:`mvn versions:set -DnewVersion=2.0.0` 2. 自动更新子模块关联: ```shell mvn -N versions:update-child-modules ``` 3. 验证依赖传递关系:`mvn dependency:tree` --- #### 6. SNAPSHOT版本管理 - 开发阶段使用`1.0.0-SNAPSHOT`格式 - 发布时去除`-SNAPSHOT`后缀 - 配置仓库管理器(如Nexus)自动清理过期快照 $$ \text{版本号规范} = \text{主版本号}.\text{次版本号}.\text{修订号}[-SNAPSHOT] $$ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaxiaoli_2013

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值