前几天突然心血来潮准备开始分享自己写的代码,然后在上传到jcenter的时候遇到了各种个样的问题,有了一些自己的心得,所以决定把这个作为我简书第一篇文章
首先基础的东西我不说了,只是说一下我遇到的一些问题和解决方法。
建立Repository的问题
在jcenter上建立帐号完后,需要建立一个自己Repositories ,在配置的过程中,需要填写这个Repositories的名字,需要在gradle配置中对应上。
例如:我在jcnter上建立了一个名字为repo,类型为maven的仓库,然后在gradle配置上要对应上,我看网上很多人都写的maven,其实这个名字是随意的。
bintray { user = properties.getProperty("bintray.user")
key = properties.getProperty("bintray.key")
configurations = ['jcenter_upload'] //使用自己的配置
pkg {
repo = "repo" //这个是在jcenter上建立的仓库名字,其实就是一个组织结构,例如,你可以在自己的账户上建立一个jcenter,然后在这个jcenter上建立这个package。此时这个repo就写jcenter
name = POM_ARTIFACT_ID //发布到Bintray上的项目名字
websiteUrl = POM_URL
vcsUrl = POM_SCM_CONNECTION
licenses = ["Apache-2.0"]
publish = true
}
}
而且,你也要理解,jcenter其实也是一个仓库的名字,但是人家的仓库非常的大,所以变成了公用的了,而我们开源到jcenter上的jar,aar等,都是先上传到我们自己的仓库上,然后jcenter的管理者为我们加入了某种功能,可以让我们仓库的package ,link 到jcenter上。
关于module和artifactid不一致的问题
我遇到的最大的问题就是上传代码的问题。我弄了半天才搞好。问题产生的原因是这样的,我开源的是一个android 的aar文件,然后在我的工程里,这个开源的aar文件是一个module,我起了个library的名字,就是因为我开源的东西使用的是一个module,而且名字不是我开源的artifactID的名字,导致我每次上传到jcenter的pom,aar,jar等文件都是一个module的名字开头的,所以jcenter也会按照这个名字组织这个jar的坐标。
eg:
我的group是com.github.yujintao529,然后artifact的名字mixdpic。所以 我希望上传到jcenter的坐标是com/github/yujintao529/mixdpic/version
但是由于jcenter提供的插件默认用的module的名字,所以上传到jcenter的东西变成了com/github/yujintao529/library/version。
经过我的努力探索,解决方案如下:( gradle的知识不在说了)
自定一个configuration名字叫jcenter_upload,改变该aar文件的名字
android {
libraryVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File( output.outputFile.parent,
POM_ARTIFACT_ID + ".aar".toLowerCase())
}
}
}
configurations.create("jcenter_upload")
然后把生成的androidSourcesJar,androidJavadocsJar和aar文件添加进去
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
classifier = 'javadoc'
baseName = POM_ARTIFACT_ID
from androidJavadocs.destinationDir
}
task androidSourcesJar(type: Jar) {
classifier = 'sources'
baseName = POM_ARTIFACT_ID
from android.sourceSets.main.java.source
}
artifacts {
add("jcenter_upload",androidSourcesJar)
add("jcenter_upload",androidJavadocsJar)
add("jcenter_upload",project.file("build/outputs/aar/mixdpic.aar"))
}
最后修改mavenInstaller和bintray使用的configuration
repositories.mavenInstaller {
configuration = configurations.jcenter_upload
pom.groupId = GROUP
pom.artifactId = POM_ARTIFACT_ID
*****
}
bintray {
configurations = ['jcenter_upload']
****
}
这样就可以正确的上传了。
其实这个地方似乎有个bug,默认情况下,jcenter的插件是使用名字是archives的configuration,最开始我的想法就是直接使用这个,但是如果把jcenter_upload换成archives,docJar和sourceJar可以正确的上传,但是aar文件还是module的名字。最开始我以为archives的里面需要发布的file没有改过来,所以我特意打印了出来
install {
doLast {
def configuration = project.configurations.getByName("archives")//获取名字为archives的configuration
def files = configuration.getArtifacts().files.getFiles()//获取artifacts 发布的文件
System.out.println("doLast files length "+files.size())
files.each { file ->
System.out.println("files " + file.getName())
}
}
}
结果惊奇的发现,结果是正确并没有出现library的名字,但是它上传的时候就是会出现问题,他们插件的网站也有这个issues而且,我还留了言。所以最后迫不得已,我自己创造一个configuration,就不会出现问题了。
具体的例子可以看我的这个project
结尾
总结一下,因为第一次发文章,文章的组织结构不是很好,有些乱,但是出现的这个问题,还是很有参考价值的。从中需要学习很多gradle的知识和增长了解决问题的能力。还有大家不要去盲目的去百度看别人怎么写,直接超过来用,每个人的问题可能不一样,所以很可能会给你造成的困扰,一定要培养出自己解决问题的能力,这里包括查看文档,代码,调试等等一些列的知识面。
哈哈,原来可以直接设置archives的名字~~:
参考:project.archivesBaseName