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

news2024/12/23 16:23:06

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

  • 第一种:在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: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吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql之增强查询

增强查询主要是对之前一些指令的补充 查询增强 主要针对单表查询的增强操作,也是上面一些细节的补充 -- 使用where语句 -- 查找1991.1.1后入职的员工 -- 主要是介绍在mysql中日期类型可以直接比较,需要注意格式 SELECT * FROM empWHERE hiredate &g…

【异常】记一次因修复漏洞扫描导致SpringSecurity出现的循环依赖问题

一、循环依赖问题 APPLICATION FAILED TO START Description: The dependencies of some of the beans in the application context form a cycle: ┌─────┐ | springSecurityConfig (field private XXXX.config.MyauthenticationProvider XXXX.config.SpringSecurityC…

十五天学会Autodesk Inventor,看完这一系列就够了(十),凸雕、贴图

众所周知,Autocad是一款用于二维绘图、详细绘制、设计文档和基本三维设计,现已经成为国际上广为流行的绘图工具。Autodesk Inventor软件也是美国AutoDesk公司推出的三维可视化实体模拟软件。因为很多人都熟悉Autocad,所以再学习Inventor&…

springcloud alibaba -- seata原理和使用

文章目录一、认识Seata1.1 Seata 是什么?1.2 了解AT、TCC、SAGA事务模式?AT 模式前提整体机制如何实现写隔离如何实现读隔离TCC 模式Saga 模式Saga 模式适用场景Saga 模式优势Saga 模式缺点二、Seata安装2.1 下载2.2 创建所需数据表2.2.1 创建 分支表、全局表、锁表2.2.2 创建…

内存一致性模型概念

phrase-20230117184107 内存一致性模型(Memory Consistency Models)提供内存一致性保证,一致性结果体现在程序内存操作是可预测的。例如在多核或多处理器硬件上,在编写并行的程序时,如果理解当前系统所使用的一致性模型,有助于使…

OpenStack GPU直通服务器

layout: post title: OpenStack GPU直通服务器 catalog: true tag: [OpenStack, GPU] 1. 概述2. 直通GPU特性3. 功能说明 3.1. 操作系统支持3.2. 设备支持 4. 实现方案5. 部署方案 5.1. 示例环境说明5.2. 上线步骤 5.2.1. 硬件安装5.2.2. GPU计算节点主机配置 5.2.2.1. IOMMU设…

【数据结构与算法学习8】二叉查找树的基本介绍与添加数据的过程

程序员语录: 把时髦的技术挂在嘴边,还不如把过时的技术记在心里。 1 二叉查找树是什么? 二叉查找树是一种数据结构,又叫作二叉搜索树或二叉排序树,采用了图的树形结构,数据存储于二叉查找树的各个结点中,每…

GEE 9:Earth Engine Reducers 的基本操作

目录1.Image 、ImageCollection and Regions Reducers(图层和区域的相关操作)1.1 Image Reductions(处理单个图层)1.2 ImageCollection Reductions(处理图层集)1.3 Greenest pixel (maximum NDVI) composit…

01背包——二维动态规划【c++】代码实现

今天学了01背包,就想来讲一讲,正好回顾一下(BZOJ上的题目)。 01背包 所谓01背包,也就是背包的一种,01背包和完全背包的区别就在于,01背包一件物品只能选择一次,而完全背包可以重复…

架构运维篇(七):Centos7/Linux中安装Zookeeper

版本说明 JDK :1.8(已安装)ZK : 3.8.0 安装部署Zookeeper 第一步:下载最新版本 官网地址:Apache DownloadsHome page of The Apache Software Foundationhttps://www.apache.org/dyn/closer.lua/zookeeper/zookeep…

libvirt零知识学习1 —— libvirt简介

本文内容部分取自《KVM实战 —— 原理、进阶与性能调优》,非常好的一本书。 1. 概述 提到KVM的管理工具,首先必须要介绍的无疑是大名鼎鼎的libvirt。libvirt是目前使用最为广泛的对KVM虚拟机进行管理的工具和应用程序接口。并且,一些常用的虚…

Oracle VM VirtualBox 安装 CentOS Linux

Virtual Box VirtualBox是一个强大的、面向个人用户或者企业用户的虚拟机产品,其支持x86以及AMD64/Intel64的计算架构,功能特性丰富、性能强劲,支持GPL开源协议,其官方网址是www.virtualbox.org,由Oracle开源&#xf…

Spring自动装配

自动装配的三种方式一、xml方式自动装配二、 按类型自动装配三、使用注解一、xml方式自动装配 byName: 会自动在容器上下文查找,和自己对象set方法后面的值对应的bean id(通过id匹配) //实体类 Data public class Pepole {private String n…

GameFrameWork框架(Unity3D)使用笔记(八) 实现场景加载进度条

前言: 游戏在转换场景的时候,需要花费时间来加载相关的资源。而这个过程往往因为游戏场景的规模和复杂度以及玩家电脑配置的原因花费一小段时间(虽然这个项目里用不到)。 所以,如果这一小段时间,画面就卡在…

计算机网络 —— TCP篇 三次握手与四次挥手

计算机网络系列文章目录 TCP篇 三次握手四次挥手 socket 文章目录计算机网络系列文章目录前言4.1 tcp三次握手与四次挥手面试题4.1.1 TCP的基本认识TCP头部为什么需要tcp,tcp工作在哪一层什么是tcp什么是tcp连接如何唯一确定一个tcp连接(tcp&udp比较) UDP 和 T…

机器学习【西瓜书/南瓜书】--- 第1章绪论+第二章模型选择和评估(学习笔记+公式推导)

【西瓜书南瓜书】task01: 第1、2章(2天) 第一章 绪论 主要符号表 下述这些符号在本书中将频繁的使用,务必牢记于心各个特殊符号所具有的的含义 🌟对上述部分定义做一下解释: 向量有维度,其中的元素是有…

路由器NAT典型配置

1.组网需求内部网络中IP地址为10.110.10.0/24的用户可以访问Internet,其它网段的用户则不能访问Internet。外部的PC可以访问内部的服务器。公司具有202.38.160.100/24至202.38.160.105/24六个合法的IP地址。选用202.38.160.100作为公司对外的IP地址,WWW服…

stm32平衡小车(2)-----编码器电机驱动

前言:之前做arduino小车的时候使用的是L298N电机,没有用过编码器,这次第一次用编码器,还是比较懵圈,记录一下学的整个过程。 1.编码器的简介 霍尔编码器是一种通过磁电转换将输出轴上的机械几何位移量转换成脉冲或数字…

下载整个网站

使用Cyotek WebCopy下载整个网站一、下载网站复制所需软件:二、打开Cyotek WebCopy,然后下载网站系统环境:win10 所需工具:Cyotek WebCopy 一、下载网站复制所需软件: https://www.cyotek.com/cyotek-webcopy/downloa…

3-3存储系统-高速缓冲存储器Cache

文章目录一.概述二.Cache与主存的映射方式1.直接映射2.全相联映射3.组相联映射三.Cache中主存块的替换算法1.随机算法RAND2.先进先出算法FIFO3.最近最少使用算法LRU4.最不经常使用算法LFU四.Cache写策略1.写命中2.写不命中一.概述 高速缓冲存储器(Cache&#xff09…