将Android Library项目发布到JitPack仓库
将项目代码导入Github
1.将本地项目目录初始化为 Git 仓库。 默认情况下,初始分支称为 main;
如果使用 Git 2.28.0 或更高版本,则可以使用 -b 设置默认分支的名称。
git init -b main
如果使用 Git 2.27.1 或更低版本,则可以使用 git symbolic-ref 设置默认分支的名称。
git init && git symbolic-ref HEAD refs/heads/main
2.在新的本地仓库中添加文件。 这会暂存它们用于第一次提交。
$ git add .
# Adds the files in the local repository and stages them for commit. 若要取消暂存文件,请使用“git reset HEAD YOUR-FILE”。
3.提交暂存在本地仓库中的文件。
$ git commit -m "First commit"
# Commits the tracked changes and prepares them to be pushed to a remote repository. 要删除此提交并修改文件,请使用 'git reset --soft HEAD~1' 并再次提交和添加文件。
4.在 GitHub.com 上创建一个新存储库。 为避免错误,请勿使用 README、许可或 gitignore 文件初始化新存储库。 您可以在项目推送到 GitHub 之后添加这些文件。
5.在存储库主页,单击Code 复制远程存储库URL,这里我们使用SSH URL。
使用SSH进行连接,需要新增 SSH 密钥到 GitHub 帐户,如果已存在可跳过。
添加方法参考下面这个连接
https://docs.github.com/zh/authentication/connecting-to-github-with-ssh/working-with-ssh-key-passphrases
6.本地仓库中添加远程存储库的 URL(将在其中推送本地存储库),请运行以下命令。 将 REMOTE-URL 替换为 前面复制的完整URL。
git remote add origin REMOTE-URL
要验证远程 URL 设置是否正确,请运行以下命令。
git remote -v
origin git@github.com:cncomer/okpermission.git (fetch)
origin git@github.com:cncomer/okpermission.git (push)
7.添加maven-publish插件
要在JitPack.io上构建Android库,我们还需要在build.gradle文件中添加maven-publish插件,下面是可供参考的相关配置和说明。
plugins {id 'com.android.library'//添加maven-publish插件id 'maven-publish'
}// 在maven-publish插件的基础使用中是不包含上传aar包的源码。
// 增加上传源码的task,如:
tasks.register("sourceJar", Jar) {// 通过 android.sourceSets.main.java.srcDirs 指定的源码,只能识别到 Java 文件,而 kt 文件被忽略了,但 通过查看官方文档可以知道,from 函数是可以指定源码路径的,// 所以这里直接把 from 函数的参数替换为 源码路径,如以下代码from android.sourceSets.main.java.getSrcDirs() // 源码路径archiveClassifier = "sources"
}//publishing用于配置项目发布相关信息,可以配置的信息有两个:repositories 和 publications
publishing {// 配置maven 仓库repositories {// 本地仓库位于USER_HOME/.m2/repositorymavenLocal()
// // 其他maven仓库
// maven { url uri('/Users/h__d/Desktop/1') }
// // aliyun镜像仓库
// maven {
// // 凭证 访问仓库的 账号和密码
// credentials {
// username 'username' // 仓库发布用户名
// password 'password' // 仓库发布用户密码
// }
// // 仓库地址
// url 'https://maven.aliyun.com/nexus/content/groups/public/'
// }}// 配置需要发布的jar的信息,即aar包的信息。publications是一个容器,类型是 PublicationContainer,其可以配置的信息类型是MavenPublication,可以理解成是一个列表集合,// 而集合中存储的对象是 MavenPublication,而对象的名称可以由自己随便定义。 所以 publications 也是可以配置多个的,如:releasepublications {// 任务名称:release (名称可以随便定义)比如release表示发布正式包,debug表示snapshot包release(MavenPublication) {// 上传指定aar包的方式有两种// 依赖 bundleReleaseAar 任务,并上传其产出的aarafterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) } // 方式一:生成aar包// artifact "$buildDir/outputs/aar/${project.name}-release.aar" // 方式二:指定生成的aar路径groupId = "com.github.cncomer"artifactId = "okpermission"version = "1.0.0"artifact sourceJar// 依赖传递// 经过基础与上传源码后,是能正常依赖与使用的,但是aar包原本依赖的一下第三方包是不会自动依赖,需要手动添加依赖。// 把library中的依赖信息,手动添加到 pom 文件中,就可以完成依赖传递,如下:// pom文件中声明依赖,从而传递到使用方,注意需要--no-configuration-cache选项pom.withXml {def dependenciesNode = asNode().appendNode('dependencies')configurations.implementation.allDependencies.each {// 避免出现空节点或 artifactId=unspecified 的节点if (it.group != null && (it.name != null && "unspecified" != it.name) && it.version != null) {println "dependency=${it.toString()}"def dependencyNode = dependenciesNode.appendNode('dependency')dependencyNode.appendNode('groupId', it.group)dependencyNode.appendNode('artifactId', it.name)dependencyNode.appendNode('version', it.version)dependencyNode.appendNode('scope', 'implementation')}}}}}
}
执行下面的任务检查库是否能安装到mavenLocal($HOME/.m2/repository)
./gradlew publishToMavenLocal
// or if you named your publication "release"
./gradlew publishReleasePublicationToMavenLocal
执行成功后会输出BUILD SUCCESSFUL。
在USER_HOME.m2/repository下生成了软件包文件。
8.添加jitpack.yml配置文件
JitPack.io默认的构建环境是java8,如果我们的项目使用的gradle插件版本8.5.0,需要Java17,就需要在根项目创建jitpack.yml文件,指定Java版本。
参考Building :: Documentation for JitPack.io
//jitpack.yml
jdk:
- openjdk17
如果需要一个指定的版本,可以输入以下内容:
//jitpack.yml
before_install:
- sdk install java 11.0.10-open
- sdk use java 11.0.10-open
否则可能在JitPack上看到编译错误
或者
这些编译错误都是Gradle插件所需的java版本高于编译环境的java版本导致的。我们可以从Android Studio设置里查看gradle使用的java版本。
9.将本地存储库推送到 GitHub.com,请运行以下命令。
git push -u origin main
如果默认分支并非名为“main”,请将“main”替换为默认分支的名称。
-u 的作用是将本地的分支与远程的对应分支关联起来,这样在后续的操作中,可以直接使用 git push 或 git pull 命令来同步这两个分支,而无需每次都指定远程仓库名和分支名。
此时可能会报错,比如
如果前面在Github上创建存储库的时候选择了创建README、.gitignore,就会碰到这个问题。
大概意思就是需要先pull更新一下,然而git pull origin main的时候又提示
git pull fatal: refusing to merge unrelated histories
这个错误发生在尝试使用git pull命令合并两个独立的git仓库时。Git拒绝合并没有共同祖先的两个分支的历史记录,因为这样的合并可能会导致数据丢失。自Git 2.9版本以后,默认情况下,如果尝试合并两个没有共同历史的分支,Git会拒绝进行合并,并提示这是一个“unrelated histories”错误。
解决方法:
你可以使用--allow-unrelated-histories选项来允许这样的合并操作。执行以下命令:
git pull --allow-unrelated-histories
这将允许Git合并两个独立的历史,进行不带控制的合并。如果你确信这两个仓库之间的合并是有意为之,这样做是安全的。如果不确定,你可能需要仔细检查合并的结果,确保没有丢失重要的更改。
$ git pull --allow-unrelated-histories origin main
From github.com:cncomer/okpermission
* branch main -> FETCH_HEAD
CONFLICT (add/add): Merge conflict in .gitignore
Auto-merging .gitignore
Automatic merge failed; fix conflicts and then commit the result.
提示有冲突,解决后commit,然后再git push -u origin main,正常提交到了Github。
在Github上创建存储库的发行版
在存储库主页右边的Release处会显示当前项目的最新发行版信息,我们现在还没有,所以点击Create a new release来创建一个。
这里要注意下,发行版需要基于某个tag, 如果没有必须先创建一个,否则没法下一步。
本地仓库中添加一个名为1.0.0的tag
git tag 1.0.0
接着将tag推送到Github
git push origin 1.0.0
我们回到创建发行版编辑界面,可以选择我们刚才创建的tag,来创建对应的发行版,创建完成后该发行版会自动在JitPack执行构建,并发布到JitPack仓库。
添加JitPack仓库依赖
在JitPack.io输入Git repo url,点击Look up检索。
如果Log下面对应的图标是绿色的,就代表库项目构建成功了,可以作为依赖项使用了。
点击Get it, 就会看到添加依赖的方法。
Step 1. 在根项目settings.gradle文件中添加JitPack仓库,一般添加在repositories末尾。
dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {//其他仓库//JitPack仓库maven { url 'https://jitpack.io' }}
}
Step 2. 在项目build.gradle中添加依赖。
dependencies {implementation 'com.github.cncomer:okpermission:1.0.0'
}
点击Log查看构建状态:
相关文章:

将Android Library项目发布到JitPack仓库
将项目代码导入Github 1.将本地项目目录初始化为 Git 仓库。 默认情况下,初始分支称为 main; 如果使用 Git 2.28.0 或更高版本,则可以使用 -b 设置默认分支的名称。 git init -b main 如果使用 Git 2.27.1 或更低版本,则可以使用 git symbo…...

JAVAWeb实战(后端篇)
因为前后端代码内容过多,这篇只写后端的代码,前端的在另一篇写 项目实战一: 1.创建数据库,表等数据 创建数据库 create database schedule_system 创建表,并添加内容 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------…...

【vs】实用调试技巧——学会写优秀的代码!
🦄个人主页:小米里的大麦-CSDN博客 🎏所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html ⚙️操作环境:Visual Studio 2022 目录 一、前言 二、什么是BUG? 三、调试是什么?有多重要? 一名优秀…...
数组声明方式
数组声明方式 一、 一维数组 元素数据类型[] 数组名; // 推荐元素数据类型 数组名[]; 二、 二维数组 元素数据类型[][] 数组名称; // 推荐元素数据类型 数组名称[][];元素数据类型[] 数组名称[]; 注: 对于第三种方式元素数据类型[] 数组名称[];,可…...

Docker中Docker网络-理解Docker0与自定义网络的使用示例
场景 CentOS7中Docker的安装与配置: CentOS7中Docker的安装与配置_centos docker sock-CSDN博客 在上面安装好Docker之后。 关于对Docker中默认docker0以及自定义网络的使用进行学习。 注: 博客:霸道流氓气质-CSDN博客 实现 理解dock…...
领域驱动大型结构之SYSTEM METAPHOR(系统隐喻)
在领域驱动设计(Domain-Driven Design, DDD)中,"System Metaphor" 是一种用于帮助开发团队和业务人员在理解和沟通系统时使用的概念模型。虽然 "System Metaphor" 并不是 DDD 的核心概念,但它在敏捷开发方法&…...

web前端开发一、VScode环境搭建
1、VScode安装live server插件,写完代码后,保存就会在浏览器自动更新,不需要再去浏览器点击刷新了 2、创建html文件 3、在文件中输入感叹号 ! 4、选择第一个,然后回车,就会自动输入html的标准程序 5、…...
DiAD代码use_checkpoint
目录 1、梯度检查点理解2、 torch.utils.checkpoint.checkpoint函数 1、梯度检查点理解 梯度检查点(Gradient Checkpointing)是一种深度学习优化技术,它的目的是减少在神经网络训练过程中的内存占用。在训练深度学习模型时,我们需…...

nginx出现Refused to apply inline style because it violates
Content Security Policy的错误。根据错误提示,nginx拒绝应用内联样式,因为它违反了内容安全策略(Content Security Policy)。内容安全策略是一种浏览器机制,用于防止潜在的安全漏洞,通过限制从外部来源加载…...

【中项第三版】系统集成项目管理工程师 | 第 11 章 规划过程组⑥ | 11.15 - 11.17
前言 第11章对应的内容选择题和案例分析都会进行考查,这一章节属于10大管理的内容,学习要以教材为准。本章上午题分值预计在15分。 目录 11.15 规划资源管理 11.15.1 主要输入 11.15.2 主要工具与技术 11.15.3 主要输出 11.16 估算活动资源 11.1…...
基础警务互联网app
智慧公安以大数据、云计算、人工智能、物联网和移动互联网技术为支撑,以“打、防、管、控”为目的,综合研判为核心,共享信息数据资源,融合业务功能,构建公安智慧大数据平台,实现公安信息数字化、网络化和智…...

为了方便写CURD代码,我在UTools写了个插件SqlConvert来生成代码!
-1. 前言 为了方便摸鱼,我之前写过一个通过sql生成代码的工具,但是服务器到期了,也就懒得重新部署了。 技术框架是 SpringBoot MybatisPlus Velocity Vue ElementUI Sql-ParseeSql-Parser-ui 0. Utools应用安装 官网地址: https://u.too…...

在国产芯片上实现YOLOv5/v8图像AI识别-【2.2】RK3588上C++开发环境准备及测试更多内容见视频
本专栏主要是提供一种国产化图像识别的解决方案,专栏中实现了YOLOv5/v8在国产化芯片上的使用部署,并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频:https://www.bilibili.com/video/BV1or421T74f 板子…...

2024数据资产入表财务实操手册
关注公众号《方案驿站》,并私信:2024数据资产入表财务实操手册,可获取本文pdf文件。...

react.16+
1、函数式组件 在vite脚手架中执行: app.jsx: import { useState } from react import reactLogo from ./assets/react.svg import viteLogo from /vite.svg import ./App.cssfunction App() {console.log(this)return <h2>我是函数式组件</h2> }exp…...
如何实现MySQL对某一张表的binlog日志进行记录
在 MySQL 中,使用触发器(Triggers)来记录表的变更是一种常见的方法。下面是具体的配置和步骤: 1. 创建日志表 首先,需要创建一个日志表,用于存储变更记录。 CREATE TABLE my_table_log (id INT AUTO_INC…...
使用requests库进行网络爬虫:入门指南
在数据收集与分析的广阔领域中,网络爬虫是一项基础而强大的技能。requests库是Python中用于发送HTTP请求的第三方库,它简洁易用,非常适合初学者学习网络爬虫。本文将带你一步步了解如何使用requests库进行基本的网络爬虫操作。 一、安装requ…...
实验5-1 使用函数计算两点间的距离
本题要求实现一个函数,对给定平面任意两点坐标(x1,y1)和(x2,y2),求这两点之间的距离。 函数接口定义: double dist( double x1, double y1, double x2, double y2 );其中用户传入的参数为平面上两个点的坐标(x1, y1)和(x2, y2),函…...

免费!OpenAI发布最新模型GPT-4o mini,取代GPT-3.5,GPT-3.5退出历史舞台?
有个小伙伴问我,GPT-4O mini是什么,当时我还一脸懵逼,便做了一波猜测: 我猜测哈,这个可能是ChatGPT4o的前提下,只支持文本功能的版本,速度更快 结果,大错特错。 让我们一起看看Open…...
目标检测损失计算部分(YOLO)
ComputeLoss 标准化坐标的增益张量 标准化坐标的增益张量(gain tensor)用于将归一化的目标转换为特定特征层的网格尺度,以便进行匹配和计算。 在目标检测模型中,输入图像被划分为多个网格,每个网格负责预测多个锚框…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...