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

article/2025/9/21 0:13:41

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

  • 第一种:在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' }……
}

依赖引用方法见官方主页,支持gitee:https://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:Pagingat ":" 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_storePasswordkeyAlias keys_keyAliaskeyPassword 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 ASM7at 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吧。


http://chatgpt.dhexx.cn/article/NJkmQnoY.shtml

相关文章

使用jitpack发布你自己的依赖库

如何优雅的让其他开发者使用我们的库。 我们经常通过gradle导入第三方库,那么我们自己的库如何提供给其他开发者使用?下边我们分别介绍使用jitpack、mavenCentral(以前叫JCenter)来发布我们的库。 在使用前,我们先了解…

JitPack的使用

JitPack的使用 1 JitPack简介2 JitPack使用1 上传代码到仓库,并创建一个release2 进入JitPack官网首页,输入仓库地址,点击Look up3 点击Get it按钮,下面生成maven仓库和依赖4 在项目的pom文件中添加上面两个依赖 3 总结 JitPack官网 官网文档 参考资料: https://blog.csdn.n…

一文详解jitpack多渠道maven库发布

先说一下,为什么会有这篇文章? 最初接触 JitPack 时,发现网络上大量涉及JitPack的教程不可用。通过两天的研究才搞明白: 1.不同的gradle版本,gradle api使用方式 与 JitPack配置方式均有所差异:使用JitPack…

【红黑树】二叉树的改进---红黑树|平衡二叉树和红黑树的区别

目录 二叉树的改进---红黑树 红黑树和AVL树(平衡二叉树)区别 确实是AVL(平衡二叉树)更严格(左右子树树高不超过1), 红黑树只保证最长路径不超过最短路径的2倍 二叉树的改进---红黑树 这个是一个 小灰程序…

红黑树是怎么实现的,看这篇真的就够了!

大家好,我是鸭血粉丝,又是一个元气满满的周一,今天带大家一文搞懂红黑树,友情提示:本文较长,建议先收藏再观看。 红黑树由来:在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树&…

红黑树解读与Java实现

红黑树解读与Java实现 概要 目录 红黑树的介绍红黑树的应用红黑树的时间复杂度和相关证明红黑树的基本操作,左右旋红黑树的基本操作,添加与调整红黑树的基本操作,删除与调整 一、红黑树的介绍 什么是红黑树? R-B Tree&#…

JDK14的新特性:JFR,JMC和JFR事件流

文章目录 简介JFRJMC创建JFR分析JFR JFR事件JFR事件流总结 简介 Java Flight Recorder(JFR)是JVM的诊断和性能分析工具。它可以收集有关JVM以及在其上运行的Java应用程序的数据。JFR是集成到JVM中的,所以JFR对JVM的性能影响非常小&#xff0…

Cocos2d-x利用jni调用java层代码

jni的意思是java本地调用,通过jni可以实现java层代码和其他语言写得代码进行交互。在cocos2d-x中,如果想要在c层调用java层的代码,就是通过jni技术。通过调用java层的代码,我们就可以在Android平台下实现一些引擎没有提供给我们的…

红黑树,学习红黑树,jdk1.8之后的新知识

红黑二叉树 1.引言 HashMap的基本结构是数组,链表和红黑树。以数组为基本形态,数组中的元素先以链表形式储存,当链表的长度超过8时(包含数组上的那个链表头)就会将链表转换为红黑树,以加快修改和查询效率…

JavaScript 红黑树

一、树的平衡性 为了能以较快的时间O(logN)来操作一棵树,我们需要保证树总是平衡的: 至少大部分是平衡的,那么时间复杂度也是接近O(logN)的也就是说树中每个节点左边的子孙节点的个数应该尽可能的等于右边的子孙节点的个数.常见的平衡树有哪些呢?AVL树: AVL树是最早的一种平衡…

最详细的对红黑树性质理解

红黑树的性质: 在了解红黑树之前,建议先去了解一下什么是二叉搜索树。 因为红黑树属于二叉搜索树特殊的分支,所以建议先去了解一下二叉搜索树。 二叉搜索树:https://blog.csdn.net/Falling_stars_/article/details/115536511 红…

JDK1.8之后,HashMap转变红黑树

当链表长度大于8并且数组长度大于64时,才会转换为红黑树 根据源码注释: 1.TreeNodes占用空间是普通Nodes的两倍。 只有当bin(bin就是bucket-桶,即HashMap中hashCode值一样的元素保存的地方)包含足够多的节点时才会转成…

jdk1.8的HashMap中的红黑树插入,为什么是红黑树而不是AVL树

jdk1.8HashMap的源码 树节点 static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> {TreeNode<K,V> parent; // red-black tree linksTreeNode<K,V> left;TreeNode<K,V> right;TreeNode<K,V> prev; // needed to unli…

浅谈红黑树

这篇文章的删除操作参考这篇博客博客地址 聊红黑树之前我想先来谈谈B树&#xff08;多路平衡查找树&#xff09;&#xff0c;为什么来聊这个东西呢&#xff0c;其实红黑树就是一个B树。了解B树后对红黑树的理解会比较有帮助。 首先是2、3、4节点。 红黑树中单个黑节点对应B树中…

红黑树的理解与代码实现

红黑树 我们知道对于二叉搜索树而言&#xff0c;无法保证树的平衡性&#xff0c;从而使得进行操作的时候时间复杂度在O(logn)与O(n)之间。这样是不稳定的。而2-3树则借助于3-结点和临时的4-结点&#xff0c;通过分解&#xff0c;解决了平衡问题。例如对于插入&#xff0c;在最终…

图解TreeMap的红黑树平衡操作fixAfterInsertion(),接着手撕红黑树添加节点

一、前言 啥也不想说&#xff0c;就卷、卷技术&#xff1b;手撕红黑树搞起。 1、红黑树简介 红黑树就是一种平衡的二叉查找树&#xff0c;其有五个特点&#xff1a; 1.每个节点要么是红⾊&#xff0c;要么是⿊⾊&#xff1b; 2. 根节点⼀定是⿊⾊的&#xff1b; 3. 每个叶⼦…

有人在jdk源码里下毒【class.newInstance() bug复现】

如图 在用反射的时候&#xff0c;发现这个方法被idea划横杠了 稍加思索后发现是这方法从jdk9开始弃用了&#xff0c;倒不影响使用&#xff0c;对象还是能正常射出来&#xff0c;就是看着很难受 &#xff08;最近刚把本地开发机从8升到11&#xff0c;难怪&#xff09; 说下我…

红黑树理解以及Java实现

红黑树本身并不复杂&#xff0c;只是在插入删除的时候情况比较多&#xff0c;如果强行记忆的话会显得比较困难&#xff0c;而且容易忘记。所以以前对红黑树一直没有很好的掌握。恰好这次借着复习数据结构的机会&#xff0c;静下心来仔细的学习了一下红黑树&#xff0c;并用Java…

Java 9 vs Java 8:引入模块化和JShell的全面升级

Java 9 是 Java 语言的一个重大版本升级&#xff0c;带来了许多新的特性和改进。 在本篇博客中&#xff0c;我将为您介绍 Java 9 的一些重要特性。 &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; 目录 一、模块化二、JShell三…

HashMap 在 JDK 1.8 后新增的红黑树结构

读完本文你将了解到&#xff1a; 点击查看 Java 集合框架深入理解 系列 - - 乾杯传统 HashMap 的缺点HashMap 在 JDK 18 中新增的数据结构 红黑树HashMap 中关于红黑树的三个关键参数HashMap 在 JDK 18 中新增的操作桶的树形化 treeifyBinHashMap 在 JDK 18 中新增的操作 红黑树…