因为新版本的gradle编译开源库的方法已经变了,所以这边记录下
1.第一步创建一个空项目
2.因为这样会创建出来一个app项目,我们上传git是不需要这个的,所以我们在
项目中setting.gradle目录下注释掉 app模块,然后就可以手动删除掉这个app模块了。
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
rootProject.name = "JitpackTest"
//include ':app' //注释掉module app
include ':mylibrary'
删除之后如下所示没有了app模块:
3.在mylibrary的build.gradle文件中添加 Maven Publish插件
Maven Publish官网的使用地址:
使用 Maven Publish 插件 | Android 开发者 | Android Developers
plugins {
id 'com.android.library'
id 'maven-publish' //添加maven publish插件
}
然后添加插件编译的Task:
afterEvaluate {
publishing {
publications {
release(MavenPublication) {
from components.release
groupId = 'com.example.mylibrary' //groupId 随便取,jitpack不会使用
artifactId = 'test' //test随便取,jitpack不会使用
version = '1.0.1' //随便取,jitpack不会使用
}
}
}
}
完整的buidle.gradle代码如下所示:
plugins {
id 'com.android.library'
id 'maven-publish'
}
android {
compileSdk 32
defaultConfig {
minSdk 21
targetSdk 32
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
}
afterEvaluate {
publishing {
publications {
release(MavenPublication) {
from components.release
groupId = 'com.example.mylibrary' //groupId 随便取
artifactId = 'test' //test随便取
version = '1.0.1'
}
}
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.4.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
4.本地编译:因为我们得用gradlew编译,所以得切换到这个路径
在控制台输入如下命令:
./gradlew publishToMavenLocal (./ 当前路径下的...)
会显示如下图所以,说明本地 编译成功了
5.把项目上传到git仓库或者码云
切换到项目目录下输入:
git init
如果本地已经存在 .git文件,说明你已经git初始化了
有些人的电脑可能会存在看不到这个文件,那是因为你文件管理中设置了 “隐藏项目”,打开即可:
把 “隐藏的项目” 勾上即可
接下来关联git上的项目:
git remote add origin (git 仓库的地址)
将本地的项目推送到git端
git push -u origin master
关于线上创建仓库,这里提醒一点:最好不要勾选下面标记的,不然会默认给你创建一个main分支,这样会和本地默认的master分支冲突
5. git线上打一个Release包:点击Releases
点击Draft a new release
选择打包Release是基于那个tag的
然后点击 Publise Release就可以
6.前往 jitpack 上编译
JitPack | Publish JVM and Android libraries
将项目的地址:
copy到如下地址,点击Look up就编译了
这个时候会显示编译失败:
点击红色的log日志查看报错内容:
意思是gradle插件需要java 11版本:
解决如上问题:
在mylibrary的build.gradle文件中添加如下:
compileOptions { sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 }
然后在整个项目的根目录下创建:jitpack.yml 文件,里面配置 java11,添加如下内容:
before_install:
- sdk install java 11.0.10-open
- sdk use java 11.0.10-open
jdk:
- openjdk11
6.再 提交到git 发布一个release版本
7.然后在jitpack上重新编译下:发现log日志编程绿色了,说明编译成功了,点击Get it
会教我们如何去使用:
到此就结束了本地库上传到jitpack仓库了。
使用:
上图是基于老版本的Gradle使用的,新版本如下添加jitpack地址:
然后再使用的地方依赖就可以了:
implementation 'com.github.awoyixiasiquanjia:mylibrary:1.0.1'
查看是否依赖上:如下图所示即成功依赖上了
我把项目贴出来,有需要的朋友可以对比下:
GitHub - awoyixiasiquanjia/mylibrary
什么是jitpack?
JitPack 的实际工作原理
-
JitPack 构建工具: JitPack 本质上是一个 构建服务,它会从 GitHub 或 GitLab 拉取源代码(通过 Git 标签、分支或 commit ID)并根据项目的构建配置(如
pom.xml
或build.gradle
)来 编译、打包 项目,生成.jar
文件。 -
动态构建: JitPack 并不保存所有的包,它只是 动态构建 并托管依赖,针对每次请求它会从 Git 仓库中拉取最新的代码,进行编译并生成可下载的包文件。
-
JitPack 仓库: 一旦 JitPack 构建完成,它会把生成的
.jar
文件发布到 JitPack 自己的 Maven 仓库(https://jitpack.io
)。这就是为什么你必须引用https://jitpack.io
仓库地址的原因,因为构建结果存储在 JitPack 自己的仓库中,而不是 Maven Central。
JitPack 与 Maven Central 的区别
- Maven Central 是一个 预构建 仓库,开发者将已经构建好的
.jar
包上传到 Maven Central,其他人可以直接引用。 - JitPack 则是一个 动态构建 仓库,它从 GitHub 或 GitLab 拉取代码,构建并发布
.jar
文件。它并不将构建好的包上传到 Maven Central,而是将其托管在自己的网站上(即https://jitpack.io
)。
所以,当你引用 JitPack 库时,实际上是从 JitPack 的仓库获取构建好的依赖,而不是从 Maven Central 获取。这就是为什么你需要在 repositories
中添加 https://jitpack.io
的地址。
为什么不直接发布到 Maven Central?
JitPack 之所以不直接把包发布到 Maven Central,而是使用自己的仓库,主要是因为它的目标是让开发者能够快速地构建和共享 Git 仓库中的代码。JitPack 提供了一个 自动化构建平台,让你能够轻松地使用 GitHub 或 GitLab 上的代码,无需手动构建或上传到 Maven Central。
如果 JitPack 要将构建的包发布到 Maven Central,它就不再是一个动态构建平台,而是一个传统的上传和发布流程,这也违背了它提供 自动构建 的初衷。
总结
- JitPack 是一个构建工具,它 动态构建 来自 GitHub 或 GitLab 的源代码,并将构建结果托管在 JitPack 自己的仓库(
https://jitpack.io
)上。 - Maven Central 是一个 静态仓库,存储的是预先构建好的包,而 JitPack 则是根据开发者的需求 实时构建和托管依赖。
- 因为 JitPack 并没有把构建好的包上传到 Maven Central,所以你必须使用
https://jitpack.io
来引用它构建的库。
什么是 Maven 仓库?
Maven 仓库(Maven Repository)是一个 远程存储库,用于存储和分发项目构建过程中所需的依赖库、插件、构建产物等。它不局限于 Maven 工具,实际上任何支持 Maven 仓库协议的工具都可以从中读取或发布依赖。
主要有两类 Maven 仓库:
- 本地仓库:通常在开发者机器上,存储已下载的依赖项(如
.jar
、.aar
、.pom
文件等)。它通常位于~/.m2/repository/
(Maven 默认路径)。 - 远程仓库:用于共享依赖,通常分为 公共仓库(如 Maven Central)和 私有仓库(如 Nexus、Artifactory)。开发者可以从远程仓库下载依赖,或者将自己的构建产物上传到远程仓库。
关键点:
- Maven 仓库并非专门为 Maven 构建工具而存在,它只是遵循 Maven 仓库协议(即,仓库中存储的文件格式和结构)。因此,不仅 Maven 可以访问,它也可以被 Gradle、Ivy、SBT 等工具使用。
- 例如,Gradle 使用
maven
仓库类型来定义和访问依赖(即repositories { maven { url "https://repo.maven.apache.org/maven2" } }
)。所以,Gradle 同样可以访问 Maven 仓库存储的库。
Maven 仓库的结构
Maven 仓库的标准存储结构是基于 Group ID、Artifact ID 和 Version 来组织文件的。每个库的路径结构通常类似于:
com/example/my-library/1.0.0/my-library-1.0.0.jar
其中:
- Group ID:通常是组织或项目的唯一标识符,如
com.example
。 - Artifact ID:具体库的标识符,如
my-library
。 - Version:库的版本,如
1.0.0
。
Maven 仓库协议
Maven 仓库协议(Maven Repository Protocol)是指在 Maven 仓库中存储、下载和发布构建产物的标准方式。它定义了如何组织文件、命名规则以及构建工具(如 Maven、Gradle、Ivy)如何与 Maven 仓库交互的约定。
Maven 仓库协议不仅限于 Maven,它也被其他构建工具(如 Gradle、Ivy)采用。理解 Maven 仓库协议可以帮助你在不同构建工具中更好地配置和使用仓库。
1. Maven 仓库的组织结构
Maven 仓库的核心特点之一就是基于 Group ID、Artifact ID 和 Version 来组织和存储依赖。每个构件(artifact)的存储路径通常由以下几个元素构成:
- Group ID:标识组织、公司或项目的唯一标识符。通常使用反向域名(如
com.example
)。 - Artifact ID:构件的名称或标识符。通常是库或模块的名称(如
my-library
)。 - Version:构件的版本号(如
1.0.0
)。 - Classifier(可选):用于指定构件的类型,例如
sources
、javadoc
或特定平台的构件(如linux
)。 - Packaging:构件的类型(如
.jar
、.aar
、.pom
等)。
2. Maven 仓库的文件类型
Maven 仓库中的文件通常包括:
- JAR 文件(.jar):Java 构件的二进制包。
- POM 文件(.pom):项目对象模型(POM)文件,用于描述构件的元数据、依赖关系和插件。
- 源代码 JAR(.jar):包含源代码的 JAR 文件(
my-library-1.0.0-sources.jar
)。 - Javadoc JAR(.jar):包含 Javadoc 文档的 JAR 文件(
my-library-1.0.0-javadoc.jar
)。 - AAR 文件(.aar):Android 库文件,类似于 JAR,但适用于 Android 项目
maven-publish的作用是解决了手动上传
是的,maven-publish
插件的作用是简化和自动化构建产物上传到 Maven 仓库的过程。它允许你通过 Gradle 脚本直接配置并上传构建产物(例如 .jar
、.aar
文件)到 Maven 仓库,避免了手动上传和复杂的命令行操作。
不过,手动上传也是可以的,只不过过程会相对麻烦,通常包括通过 命令行工具 或 Web 界面 进行上传。下面我会分别介绍如何使用 maven-publish
插件进行上传,以及如何手动上传构建产物。