web-dev-qa-db-ja.com

Androidライブラリをaarおよびソースjarを使用してMavenに公開する

Maven-publish gradleプラグインを使用してaarおよびソースjarを含むcom.Android.libraryプロジェクト/モジュールを公開する方法に関するヒントを教えてください。古いmavenプラグインでこれを行うことができますが、新しいmaven-publishプラグインを使用したいと思います。

45
ligi

新しい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で公開

64
dskinner

他の回答に基づいた、改善されたソリューションを次に示します。

要旨: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'
      })
      
  • 手動でアーティファクトパスを指定する必要はありません。

変更ログ:

  • 27.3.2018-api/implementation新しいGradleの依存関係のサポートを追加
  • 23.11.2018-新しいGradleで変更されたため、bundleReleasebundleReleaseAarに名前変更しました( this答え
  • 23.11.2018-重複した結果エントリを修正するためにgetAllDependenciesgetDependenciesに変更しました(私のGistのコメントで述べたように) 。
  • 23.04.2019-新しいGradle用に修正するために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") }
                }
            }
        }
    }
}
36
Robyer

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"
        }
    }
}

また、次を定義することで、versiongroupIdを変更できます。

version = '1.0.0'
group = 'foo.bar'
28
joecks

ボイラープレートコードを避けたい場合は、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"
        }
    }
}
14
bvarga

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
3
Philipp Hofmann