Maven-publish gradleプラグインを使用してaarおよびソースjarを含むcom.Android.libraryプロジェクト/モジュールを公開する方法に関するヒントを教えてください。古いmavenプラグインでこれを行うことができますが、新しいmaven-publishプラグインを使用したいと思います。
新しいmaven-publish
プラグインを使用したサンプルを次に示します。
apply plugin: 'maven-publish'
task sourceJar(type: Jar) {
from Android.sourceSets.main.Java.srcDirs
classifier "sources"
}
publishing {
publications {
bar(MavenPublication) {
groupId 'com.foo'
artifactId 'bar'
version '0.1'
artifact(sourceJar)
artifact("$buildDir/outputs/aar/bar-release.aar")
}
}
repositories {
maven {
url "$buildDir/repo"
}
}
}
./gradlew clean build publish
で公開
他の回答に基づいた、改善されたソリューションを次に示します。
要旨:https://Gist.github.com/Robyer/a6578e60127418b380ca133a1291f017
他の回答からの変更:
classifier
を変更しました-"sources"
でなければなりません(not"source"
)依存関係を処理します
@aar
およびtransitive: false
もサポートします。その場合、POMで除外を設定して、この依存関係のすべての推移的な依存関係を無視します。依存関係のカスタム除外ルールもサポートします。例:
compile('com.example:something:1.0', {
exclude group: 'com.exclude.this', module: 'some-module'
})
変更ログ:
bundleRelease
をbundleReleaseAar
に名前変更しました( this答え )getAllDependencies
をgetDependencies
に変更しました(私のGistのコメントで述べたように) 。project.afterEvaluate{...}
にラップされています。apply plugin: 'maven-publish'
task androidJavadocs(type: Javadoc) {
source = Android.sourceSets.main.Java.srcDirs
classpath += project.files(Android.getBootClasspath().join(File.pathSeparator))
Android.libraryVariants.all { variant ->
if (variant.name == 'release') {
owner.classpath += variant.javaCompile.classpath
}
}
exclude '**/R.html', '**/R.*.html', '**/index.html'
}
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
classifier = 'javadoc'
from androidJavadocs.destinationDir
}
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from Android.sourceSets.main.Java.srcDirs
}
project.afterEvaluate {
publishing {
publications {
maven(MavenPublication) {
//groupId 'cz.example'
//artifactId 'custom-artifact'
//version = Android.defaultConfig.versionName
artifact bundleReleaseAar
artifact androidJavadocsJar
artifact androidSourcesJar
pom.withXml {
final dependenciesNode = asNode().appendNode('dependencies')
ext.addDependency = { Dependency dep, String scope ->
if (dep.group == null || dep.version == null || dep.name == null || dep.name == "unspecified")
return // ignore invalid dependencies
final dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', dep.group)
dependencyNode.appendNode('artifactId', dep.name)
dependencyNode.appendNode('version', dep.version)
dependencyNode.appendNode('scope', scope)
if (!dep.transitive) {
// If this dependency is transitive, we should force exclude all its dependencies them from the POM
final exclusionNode = dependencyNode.appendNode('exclusions').appendNode('exclusion')
exclusionNode.appendNode('groupId', '*')
exclusionNode.appendNode('artifactId', '*')
} else if (!dep.properties.excludeRules.empty) {
// Otherwise add specified exclude rules
final exclusionNode = dependencyNode.appendNode('exclusions').appendNode('exclusion')
dep.properties.excludeRules.each { ExcludeRule rule ->
exclusionNode.appendNode('groupId', rule.group ?: '*')
exclusionNode.appendNode('artifactId', rule.module ?: '*')
}
}
}
// List all "compile" dependencies (for old Gradle)
configurations.compile.getDependencies().each { dep -> addDependency(dep, "compile") }
// List all "api" dependencies (for new Gradle) as "compile" dependencies
configurations.api.getDependencies().each { dep -> addDependency(dep, "compile") }
// List all "implementation" dependencies (for new Gradle) as "runtime" dependencies
configurations.implementation.getDependencies().each { dep -> addDependency(dep, "runtime") }
}
}
}
}
}
Dskinnersに少し手を加えて、正しい依存関係を生成します。
apply plugin: 'maven-publish'
task sourceJar(type: Jar) {
from Android.sourceSets.main.Java.srcDirs
classifier "source"
}
publishing {
publications {
bar(MavenPublication) {
groupId 'com.foo'
artifactId 'bar'
version '0.1'
artifact(sourceJar)
artifact("$buildDir/outputs/aar/bar-release.aar")
pom.withXml {
def dependenciesNode = asNode().appendNode('dependencies')
//Iterate over the compile dependencies (we don't want the test ones), adding a <dependency> node for each
configurations.compile.allDependencies.each {
if(it.group != null && (it.name != null || "unspecified".equals(it.name)) && it.version != null)
{
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', it.group)
dependencyNode.appendNode('artifactId', it.name)
dependencyNode.appendNode('version', it.version)
}
}
}
}
}
repositories {
maven {
url "$buildDir/repo"
}
}
}
また、次を定義することで、version
とgroupId
を変更できます。
version = '1.0.0'
group = 'foo.bar'
ボイラープレートコードを避けたい場合は、maven-publish
プラグインは依存関係をpom.xmlに書き込みません
このプラグインを試してください: Android-maven-publish
publishing {
publications {
mavenAar(MavenPublication) {
groupId 'com.example'
artifactId 'mylibrary'
version '1.0.0'
from components.Android
}
}
repositories {
maven {
url "$buildDir/releases"
}
}
}
Android maven plugin を使用することもできます。 .aar、javadoc.jar、sources.jar、および.pomを作成し、mavenリポジトリにファイルをアップロードした後、maven-metadata.xmlを更新します。また、スクリプトを GitHub に配置しました。
apply plugin: 'com.Android.library'
apply plugin: 'maven'
//Your Android configuration
Android {
//...
}
//maven repository info
group = 'com.example'
version = '1.0.0'
ext {
//Specify your maven repository url here
repositoryUrl = 'ftp://your.maven.repository.com/maven2'
//Or you can use 'file:\\\\C:\\Temp' or 'maven-temp' for a local maven repository
}
//Upload Android library to maven with javadoc and Android sources
configurations {
deployerJars
}
//If you want to deploy to an ftp server
dependencies {
deployerJars "org.Apache.maven.wagon:wagon-ftp:2.2"
}
// custom tasks for creating source/javadoc jars
task javadoc(type: Javadoc) {
source = Android.sourceSets.main.Java.srcDirs
classpath += project.files(Android.getBootClasspath().join(File.pathSeparator))
destinationDir = file("../javadoc/")
failOnError false
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
//Creating sources with comments
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from Android.sourceSets.main.Java.srcDirs
}
//Put the androidSources and javadoc to the artifacts
artifacts {
archives androidSourcesJar
archives javadocJar
}
uploadArchives {
repositories {
mavenDeployer {
configuration = configurations.deployerJars
repository(url: repositoryUrl) {
//if your repository needs authentication
authentication(userName: "username", password: "password")
}
}
}
}
で呼び出す
./gradlew uploadArchives