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 }