Maven 是 下的一个纯 Java 开发的开源项目,基于项目对象模型(缩写:POM)概念,Maven可以从中央信息管理一个项目的构建、报告和文档等步骤。Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。
POM介绍
POM( Model)即项目对象模型,通过xml格式保存的pom.xml文件,作用类似ant的build.xml文件,功能更强大。该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等;
Glide:POM举个栗子
4.0.0
com.github.bumptech.glide
glide
4.12.0
aar
Glide
A fast and efficient image loading library for Android focused on smooth scrolling.
https://github.com/bumptech/glide
...
POM节点Maven的目标Maven仓库
Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM,AAR等等)的地方。
举个栗子:阿里&& maven 仓库
引入仓库 : 根 build.配置 —doc
vs 2.
buildscript {
repositories {
jcenter()
google()
}
}
allprojects {
addRepos(repositories)
repositories{
jcenter()
google()
mavenLocal()
mavenCentral()
maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
maven { url "file:///${rootProject.getRootDir()}/asdk" }
maven { url "file:///${rootProject.getRootDir()}/bsdk" }
}
}
{ }: the build for this .
{ }: this and each of its sub-.
注解:是脚本执行所需依赖,是项目本身需要的依赖,所以我们将自己所需要的仓库加到配置中
通过以上我们知道,打包sdk 需要一个托管的仓库,那么下面我们就介绍一下,如何搭建一个私有仓库;基于安全考虑不用公共仓库,学习一下如何搭建私有仓库。
通过nexus搭建私有仓库
Nexus 简介:是Maven仓库管理器,如果你使用Maven,你可以从Maven中央仓库 下载所需要的构件()
简介2:World’s #1 (自己夸自己世界第一,其他吹牛逼的不用看了) of truth for all of your , , and build parts and to at more than 100,000
搭建Maven私有仓库步骤
1.下载
…
2.启动
~ » /Users/caining/Documents/applications/nexus-3.28.1-01-mac/nexus-3.28.1-01/bin/nexus start
Starting nexus
3.访问
:8081/
4.修改端口方法
cd /Users/caining/Documents/applications/nexus-3.28.1-01-mac/nexus-3.28.1-01/etc
vim nexus-default.properties
###########################配置如下
# Jetty section
application-port=8081
application-host=0.0.0.0
5.登录
nexus 2 的默认账号密码 admin:默认密码登录; nexus 3第一次启动后 会自动生成admin 的密码,存在admin.
查看密码
~ » vim /Users/caining/Documents/applications/nexus-3.28.1-01-mac/sonatype-work/nexus3/admin.password
-39e2-4e14-90bb-
6.首次登录后设置密码7.停止
~ » /Users/caining/Documents/applications/nexus-3.28.1-01-mac/nexus-3.28.1-01/bin/nexus stop
Shutting down nexus
Stopped.
脚本打包sdk并上传Maven
一、在工程下新建 maven-push. 脚本
apply plugin: 'maven'
uploadArchives {
repository(url: maven.address) { authentication(userName: maven.username, password: maven.password) }
pom.groupId = maven.MAVENGROUPID
pom.artifactId = ARTIFACT
pom.version = maven.appLibVersion
pom.packaging = 'aar'
pom.project {
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
}
}
二、配置根配置
1.新建 config.gradle
2.apply from: 'config.gradle'
3.
ext {
maven = [
address : "http://localhost:8081/repository/maven-releases/",//maven 仓库地址
username : "admin",
password : "123456",
appLibVersion : "1.0.6",//打包版本号
buildMAVEN : true ,//是否打开upload功能,为宿主工程准备、、最小侵入宿主工程
MAVENGROUPID : "com.cnn.sdk"//打包groupId 这里统一设置,如需要不同,请module中单独设置
]
}
三 、 ext 是什么?
ext属性是类型的一个特殊的属性,本质是一个Map类型的变量;使用ext属性的好处可以在任何能获取到的地方访问这些属性. 与 ext 的不同?由于ext 结构是map,所以可以分组,比 . 好用一些,一些系统级的配置可以放. ,用户基本的配置可以放ext 比如版本号啥的。
四、 子 . 增加名字
新建 .= —name // 这个不能随意起,起名规则后面讲
五、sdk- 子 build. 增加配置
try {
if (maven.buildMAVEN){//这里是true 在宿主工程里,会访问不到而报错
apply from: '../maven-push.gradle'
}
}catch (all){
}
以上,执行 task 就会打包并 到仓库
> Task :module01:uploadArchives
> Task :module02:writeReleaseAarMetadata
> Task :module02:bundleReleaseAar
> Task :module02:uploadArchives
Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.5/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 781ms
43 actionable tasks: 41 executed, 2 up-to-date
10:46:48 AM: Task execution finished 'uploadArchives'.
添加依赖 (path: ‘:’),这时候再执行。
重点:抛出问题:如果模块间依赖,以上脚本在全量打包时会报错 如下
原因: 依赖是本地包,所以报错
如何解决?
思路1:先传 再修改依赖为线上包,再传 ,这个思路可行,但如果遇到 过多,执行起来过于麻烦,这里不再演示,感兴趣的同学可自己执行。相互依赖打包优化问题 :填坑对于有互相依赖的包如何处理?对于关联依赖 sdk 如何一键 build 并上传Maven仓库以上存在的问题 :以上脚本虽然初步完成了sdk 打包并上传Maven仓库,但有问题存在,加入sdk 子 关联依赖时,子包不发布,主包无法打包成功,那么除了手动一步一步上传外,有没有办法一键上传?优化思路:动态替换打包后 和 (由于是动态替换,这里的工程 的名称应该与.配置的 保持一致)关键脚本如下:
pom.withXml {
def childs = asNode().children()
childs.each {
child ->
print("childName->"+child.name().toString()+"n")
if (child.name().toString().contains('dependencies')) {
child.children().each {
print("dependencies->"+it.text().toString()+"n")
if (it.text().toString().contains("unspecified")) {
def iterator = it.children().iterator()
def remove = false
while (iterator.hasNext()) {
def node = iterator.next()
if (node.name().toString().contains('groupId')) {
iterator.remove()
}
if (node.name().toString().contains('version')) {
iterator.remove()
remove = true
}
}
if (remove) {
it.appendNode('version', maven.appLibVersion)
it.appendNode('groupId', maven.MAVENGROUPID)
}
print("n return ->"+it.text().toString()+"n")
}
}
}
}
}
宿主通过仓库引入sdk
引入方式也很简单
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "groupId:artifactId:version"//此处对应上传的maven 仓库的信息
}
通过宿主工程优雅的调试sdk
通过仓库引入的第三方sdk 在宿主工程里调试,很不方便,虽然可以断电,但源码无法修改,使得在宿主程序中,遇到问题口袋妖怪个体值计算器 for android,查问题时,非常不方便,那么有没有好的办法,在本地开发时,不使用仓库包,而是直接引用源码呢?上线时,通过修改配置,引用远程仓库。
通过脚本控制引用源码or仓库
我们知道 引入模块,是在.中,如下:
常规引入
include ':sdka'
参数控制动态引入
宿主根. 增加控制参数 = true/false通过.配置动态控制是否使用仓库
if (useLocalLib.toBoolean()){
print("sdk调试使用,线上环境忽略以下内容")
include(':module01')
include(':module02')
print("path---->"+getRootDir().getParent())
project(':module01').projectDir = new File(getRootDir().getParent(),"/MavenPackage/module01")
project(':module02').projectDir = new File(getRootDir().getParent(),"/MavenPackage/module02")
}
同理,宿主工程引入lib时 ,用.-字段控制引用仓库or本地
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
if (useLocalLib.toBoolean())
implementation project(":module01")
else
implementation 'com.cnn.sdk:module01:1.0.0'
}
以上,可以在宿主工程里,通过参数口袋妖怪个体值计算器 for android,达到引入sdk源码的目的,源码并不在宿主git 下;完成优雅的调试sdk 的目的。
注意一下咯:由于篇幅原因,小编已将这些相关的知识都集结整理出来了,有需要的老铁私信下我关键词 “Java”,回复获取免费下载原文件的方式哟~
总结
本文到此结束,希望对大家有所帮助。
本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至81118366@qq.com举报,一经查实,本站将立刻删除。发布者:简知小编,转载请注明出处:https://www.jianzixun.com/76221.html