スポンサーリンク

【Android Studio】jarをMavenにpublishする方法

スポンサーリンク

LocalのMaven RepositoryにMaven Publish Pluginでpublishする

LocalのMaven Repository(.m2/repository)に依存関係を全て含んだcompile済のclassファイルをpublishするには,以下のように設定を行います.

plugins{
    id 'com.android.application'
    id 'maven-publish'
}

afterEvaluate{
    publishing{
        publications{
            release(MavenPublication){
                groupId = 'com.example'
                artifactId = 'id'
                version = '1.1'
                artifact('build/intermediates/app_classes/release/classes.jar')
            }
        }
    }
}

afterEvaluate

componentsはafterEvaluateでしか存在しえないため,afterEvaluate内に記述することが慣例となっています

publishing.publications

PublishingExtentionの一部で,publishの形態を規定するInterfaceとobjectです.これらは,maven-publish-pluginやivy-publish-pluginで同一です

release(MavenPublication)

適当に名前を付けます.名称に応じて実行時に選択することが可能です

groupId, artifactId, version

Mavenで求められる3種のpropertyです.指定しない場合は

  • groupId – project.group
  • artifactId – project.name
  • version – project.version

が採用されます.

artifact Object

様々な形態でartifactを指定することができます.ここで指定したartifactが上記で指定したIDでrepositoryに発行されます.

Android Studio (4.2.2),Gradle (6.7.1)で全てのclassesファイルを指定したい場合は,Task app:buildを実行した後に,build/intermediates/app_classes内部にclasses.jarが作成されていますので,これを利用します.

なお,成果物がどこに置かれるかはAndroid StudioやGradleのバージョンで結構変わりそうです./releasesやbuild/bundleの中にできている例もあるそうですので,app:buildした後にちゃんと探せばどこかにできているはずです

Objectに指定できるのは,PublishArtifact, AbstractArchiveTask, Fileのpath,Mapのいずれかです.今回はFileのpathを利用してpublishを規定しています.

publishToMavenLocal

上記でGradle Syncした後に,publishToMavenLocalというTaskが用意されているはずですので,これを実行すれば,./m2/repository内にartifactIdに従ってライブラリが作成されています.

javaファイルとして全てpublishしたい

以下のように設定すれば,main以下の全てのjavaファイルをpublish可能です.

afterEvaluate{
    publishing{
        publications{
            release(MavenPublication){
                groupId = 'com.example'
                artifactId = 'masstouring'
                version = '1.1'
                artifact createSources
            }
        }
    }
}

tasks.register('createSources',Jar){
    archiveClassifier.set("java-sources")
    from(android.sourceSets["main"].java.srcDirs)
}

archiveClassifier.set(“java-sources”)

これはjarファイルに付与するclassifierを指定します.(任意です)
ちなみにGradleにおいては,set系は以下のように書いても同様です.

archiveClassifier = "java-sources"

from Object

こちらもartifact同様に様々な形式で規定することが可能です.今回はsrcDirを指定することでアーカイブするファイルを選択しています.

今回使用しませんでしたが,特定のpluginでは特定のfromを指定することで,所定の形式でpublishすることが可能です.以下に応じて,artifactの部分を置き換えてください.

  • com.android.libraryでaarを出したい場合
    from components.release
  • com.android.applicationでZip等を出したい場合:
     from components.release_apk
  • com.android.applicationでAndroid App Bundleを出したい場合:
     from components.release_aab

追記

そもそも,Androidでjar化するのってレアなんでしょうかね?業務で携わっていないので分からないですが,サーバーとアンドロイド間で通信する場合に同様のBeanなりDTOを利用したい場合はあると思うのですが,そんなことないんでしょうか.

依存を全て含んだJarを作製する場合

以下からでも作成できました.正直,この場合のfromがどのfromを使っているのかいまいちわからない….

afterEvaluate{
    publishing{
        publications{
            release(MavenPublication){
                groupId = 'com.example'
                artifactId = 'masstouring'
                version = '1.1'
                artifact createSources
            }
        }
    }
}

tasks.register('createSources',Jar){
    archiveClassifier = "java-sources"
    from bundleReleaseClasses
}

main以下のjavaファイルをcompileしたclassesのjarを作製する場合

tasks.register('createSources',Jar){
    archiveClassifier = "java-sources"
    from compileReleaseJavaWithJavac
}

参考にしたリンク

MavenPublication - Gradle DSL Version 8.10
ライブラリを公開する  |  Android Studio  |  Android Developers
Android ライブラリを公開するには、リリース用のライブラリを準備し、パブリケーション バリアントとテスト フィクスチャを構成して、それらを配布する必要があります。
The Maven Publish Plugin
タイトルとURLをコピーしました