Jitpack使用指南:maven-publish如虎,jitpack如翼 【安卓Java组件化模块化】【更多gradle技巧】

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

上文总结了三种多模块开发的方法。

  • 第一种在setting.gradle中定义子模块然后 api Project(':...')直接引用 。
  • 第二种使用 maven-publish 部署至本地仓库
  • 第三种使用 jitpack.io 等部署至远程服务器

我的第一个开源项目就依次用过这三种方式:

  1. 最初使用第一种方法好处在于修改后可以直接构建和运行。但不利于维持较大公共库容易造成整个编译进程变慢和分支混乱。
  2. 后来使用 maven-publish 插件分开编译各个组件源代码仓库瞬间清爽起来。
  3. 再后来陆续有人问我怎么编译答曰需要将各模块分别编译直到编译完成主程序为止。深感无法吸引开源参与者于是花了一个晚上部署终于启用 jitpack.io。

这是一个词典应用名为“无限词典”从2019年开源至今现在编译起来应该很容易了https://github.com/KnIfER/PlainDictionaryAPP

Jitpack.io 使用指南踩坑记录

在最外层的build.gradle添加 jitpack 作为maven仓库建议排序排在最后面。

buildscript {
    repositories {
        mavenLocal()
        maven { url 'https://jitpack.io' }
        ……
}
allprojects {
    repositories {
        mavenLocal()
        maven { url 'https://jitpack.io' }
         ……
}

依赖引用方法见官方主页支持giteehttps://jitpack.io/

  • 各个组件项目的settings.gralde中勿包含与主模块同名的项目名称如
rootProject.name = "Paging"
include ':Paging'
include ':Logger'

settings.gralde文件用于指示gradle项目包含哪些模块文件夹即使用第一种分模块方式
其中 rootProject.name 可能会导致jitpack编译器报错

* What went wrong:
A problem occurred evaluating project ':Logger'.
> Failed to apply plugin 'com.android.internal.library'.
   > Your project contains 2 or more modules with the same identification com.github.appxmod:Paging
     at ":" and ":Paging".
     You must use different identification (either name or group) for each modules.
  • 一些调用本地指令的gradle脚本不能用。比如我在“为Android Studio制作提示音用音乐舒缓压力”一文中记录的提示音脚本就不能使用了。

  • 版本管理很麻烦所以建议所有版本号都使用最新版本:latest.release如

    api('com.github.appxmod:Metaline:latest.release')
  • jitpack支持多模块项目即使用第一种分模块方式此时需要注意
  1. 依赖引用方式变为 com.github.用户名.主项目名称:子模块名称:版本号而不是原来的 com.github.用户名:项目名称:版本号参考jitpack.io的编译日志如 appxmod/GlideModule项目中同时包含四个模块引用起来是这个样子的
   api('com.github.appxmod.GlideModule:GlideModule:latest.release')
   api('com.github.appxmod.GlideModule:GifDecoder:latest.release')
   api('com.github.appxmod.GlideModule:DiskLruCache:latest.release')
   compileOnly ('com.github.appxmod.GlideModule:Compiler:latest.release')
   annotationProcessor ('com.github.appxmod.GlideModule:Compiler:latest.release')
   implementation('com.github.appxmod.GlideModule:Annotation:latest.release')
  1. 模块之间相引用应直接使用 project 指令如api project(':模块名称')而不是 api 'com.github……'
  • jitpack支持github或gitee的组织和用户名一样如 com.gitee.组织名称

  • maven-publish 插件会影响 jitpack 编译。比如使用 from components.all 指令就会生成 release、debug多种编译版本可能会导致引用出错比如gradle根据引用项目去 jitpack.io 服务器寻找 “某组件-release.aar”但是没有这个文件因为对方使用的是 from components.release只有一个编译版本只有 “某组件.aar”没有 “某组件-release.aar”参考编译日志。

  • jitpack.io 的仓库可直接在浏览器中访问。

  • jitpack 一般是去编译 release tag需在浏览器中访问查看编译状态。编译速度很慢似要排队。建议先通过本地编译再去浏览器触发 jitpack 编译。编译必须有先后顺序依赖项少的先来。如果编译失败不一定要新建 release tag可在 github 或 gitee 删除 release、tag然后重建同名release最后在 jitpack 页面上点“叉”图标重新触发编译。

请添加图片描述

上面的log图标点进去查看编译日志绿色代表编译成功可以正常使用了。

初次大量使用 jitpack如有错误请指正。

混合使用本地仓库

jitpack上面的内容不是自己编译后上传的而是远程机器编译。如果是独自研发或者是原创者那最好能够切换回本地仓库自己去编译。

本地编译时为每个组件加载额外的 gradle 属性文件覆盖原有属性。

// Load keystore
def localMavenFile = rootProject.file("localMaven.properties");
if (localMavenFile.exists()) {
    def props = new Properties();
    props.load(new FileInputStream(localMavenFile ))
    props.each { prop ->
        project.ext.set(prop.key, prop.value) // 覆盖
    }
}

默认的项目属性文件 gradle.properties

libs_lucene=com.github.appxmod:Lucene:latest.release

用于覆盖重写依赖项的属性文件 localMaven.properties

libs_lucene=org.appxmod.lucene:Core:latest.release

最后使用

dependencies {
  api libs_lucene
}

安卓打包debug使用与release相同的签名使得调试版本和发行版本可相互覆盖安装

// Load keystore
def keystorePropertiesFile = rootProject.file("keystore.properties");
def keystoreDefined = keystorePropertiesFile.exists();
if (keystoreDefined) {
    def props = new Properties();
    props.load(new FileInputStream(keystorePropertiesFile))
    props.each { prop ->
        project.ext.set(prop.key, prop.value) // 直接加载到项目属性方法来自 https://stackoverflow.com/questions/11749384/gradle-include-properties-file#answer-33484783
    }
}

项目根目录新建文件keystore.properties存储密码

keys_storePassword=密码1
keys_keyPassword=密码2
keys_keyAlias=键名
keys_storeFile=C:\\文件路径.jks

注意没有 keys_ 前缀会与默认的项目属性冲突

最后再在 gradle 中使用

android { ……
//签名设置
    signingConfigs {
        debug {
            if (keystoreDefined) {
                storeFile file(keys_storeFile)
                storePassword keys_storePassword
                keyAlias keys_keyAlias
                keyPassword keys_keyPassword
            }
        }
    }

从TTS 、 legado等开源项目中学来的不过有改进1. 无需将密码存储在 gradle 中。 2. 无需加载到 keystoreProperties 对象直接将密码等常量加载为全局属性。

修复?b问题

多次编译竟然会报错This feature requires ASM7 rebuild成功接着修改一处字符串反复测试编译一两三次增量编译成功然后再增量编译就会出现令人费解的 ASM7 问题。

毕竟是奇迹产品一个小公司制作的世界级开发工具虽然才华横溢但出现种种问题也是情理之中。我常常在想如果没有kotlin分心如果那些上游开发者集中精力我是否能使用更好的android studio

报错模块是 glide 魔改组件

error processing C:\Users\TEST\.m2\repository\org\appxmod\glide\Compiler\1.0.0\Compiler-1.0.0.jar
java.lang.UnsupportedOperationException: This feature requires ASM7
	at org.objectweb.asm.ClassVisitor.visitNestHost(ClassVisitor.java:150)
	at org.objectweb.asm.ClassReader.accept(ClassReader.java:541)
	at org.objectweb.asm.ClassReader.accept(ClassReader.java:391)
	at com.android.builder.desugaring.DesugaringClassAnalyzer.analyze(DesugaringClassAnalyzer.java:153)
	at com.android.builder.desugaring.DesugaringClassAnalyzer.analyzeJar(DesugaringClassAnalyzer.java:100)
	at com.android.builder.desugaring.DesugaringClassAnalyzer.analyze(DesugaringClassAnalyzer.java:68)
	at com.android.build.gradle.internal.tasks.DesugarIncrementalHelper.lambda$getInitalGraphData$4(DesugarIncrementalHelper.java:146)
	at java.base/java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1448)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
	at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)

最后发现是连续用 build > make project 菜单构建项目就会报错也不知道什么原因反正是直接运行反而不会报错不用修复。这个问题以前遇到过没写笔记记住。

安卓打包release前执行脚本

无限词典打包release前需要编译一下某些js或html内容需要打包一些资源文件。

算了。太难实现了谁会

还是用单独运行IDEA吧。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Javaandroid

“Jitpack使用指南:maven-publish如虎,jitpack如翼 【安卓Java组件化模块化】【更多gradle技巧】” 的相关文章